IncompatibleClassChangeError:接口未实现

时间:2012-05-29 10:42:54

标签: android

从Android市场我得到了以下崩溃报告。在测试我的应用时我没有找到。崩溃发生在PasswordActivity类中。我正在发送堆栈跟踪和代码。任何人都可以告诉我崩溃的发生地点以及发生这种情况的原因。

堆栈跟踪

java.lang.IncompatibleClassChangeError: interface not implemented
at in.plackal.lovecyclesfree.PasswordActivity.onCreate(PasswordActivity.java)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
at android.app.ActivityThread.access$2300(ActivityThread.java:125)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4627)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636)
at dalvik.system.NativeStart.main(Native Method)

我的代码

public class PasswordActivity extends Activity implements Utilities
{
//Private Variables
private EditText m_passwrdEditText;

private TextView m_passwrdErrorText;

private Resources m_res;

@Override
public void onCreate(Bundle savedInstanceState) 
{
    //Setup the activity
    super.onCreate(savedInstanceState);
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);     
    DisplayMetrics dm = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(dm);


    if(dm.widthPixels == 320 && dm.heightPixels == 480)
    {
        setContentView(R.layout.password_activity_hvga);
    }
    else
    {
        setContentView(R.layout.password_activity);
    }

    GoogleAnalyticsTracker tracker = GoogleAnalyticsTracker.getInstance();;
    tracker.startNewSession("UA-xxxxxxx-1", this);
    tracker.trackPageView("Password");
    tracker.dispatch();

    m_res = getResources();

    final Typeface face = Typeface.createFromAsset(getAssets(), "fonts/Cicle Semi.otf");     

    m_passwrdErrorText  = (TextView) findViewById(R.id.txt_error_message);
    m_passwrdErrorText.setTypeface(face);

    m_passwrdEditText  = (EditText) findViewById(R.id.txt_edit_passwrd);
    m_passwrdEditText.setOnClickListener(new OnClickListener() 
    {           
        @Override
        public void onClick(View v) 
        {
            m_passwrdEditText.setHint("");
            m_passwrdEditText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
            m_passwrdEditText.setTypeface(face);
        }
    });

    m_passwrdEditText.setTypeface(face);

    m_passwrdEditText.setOnKeyListener(new OnKeyListener() 
    {
        public boolean onKey(View v, int keyCode, KeyEvent event) 
        {           
            if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER))
            {                             
                String strPassEntered = m_passwrdEditText.getText().toString();
                String strPassSaved = CycleManager.getSingletonObject().getPassWord();
                m_passwrdEditText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
                if (strPassSaved.equals(strPassEntered) || strPassEntered.equals(DEFAULT_PASSWORD))
                {
                    Intent intent = new Intent(PasswordActivity.this, ActivityManager.class);
                    startActivity(intent);  
                    PasswordActivity.this.finish();
                }
                else
                {
                    m_passwrdErrorText.setText(m_res.getString(R.string.passwrd_error_text));
                    m_passwrdEditText.setFocusable(true);                                           
                }
            }

            else if(keyCode == KeyEvent.KEYCODE_DEL)
            {
                m_passwrdEditText.setHint(m_res.getString(R.string.passwrd_hint_text));
                m_passwrdErrorText.setText("");
            }

            m_passwrdEditText.setTypeface(face);
            return false;
        }
  });
}
}

5 个答案:

答案 0 :(得分:1)

我在IncompatibleClassChangeError: interface not implemented课程中看到了有关Service个异常的Play商店的2个报告,其中包含onStartCommand(Unknown Source)的日志消息。我正在使用Eclipse来构建已发布的应用程序。

幸运的是,我室友的电话遇到了同样的例外。通过以下链接阅读:What causes java.lang.IncompatibleClassChangeError?后,我修复它的方式(至少在我的室友手机上)是将android-support-v4.jar添加到" libs"项目文件夹并添加到构建路径。然后在Project" Java Build Path" "订单和导出"下的部分,导出新添加的jar文件并删除了导出" Android私有库"的选择。

答案 1 :(得分:0)

调查您的界面,实用程序

public class PasswordActivity extends Activity implements Utilities

使用此界面需要实现哪些功能?

Eclipse通常会针对这些问题提供快速修复

答案 2 :(得分:0)

必须是某种安装故障,重新安装可能会有所帮助但是你无法告诉用户,我担心。

答案 3 :(得分:0)

方法很长,堆栈跟踪没有行号(你删除了吗?)

onCreate中的一个方法调用是通过一个接口,该接口未在您收到错误报告的设备上实现。这听起来很奇怪。

问题在于,当您编译代码时,它使用的是另一个版本(可能更新),并且该版本有一个实现接口的类。但是,在您的目标版本(您编译的版本)和运行报告来自的设备的版本(旧版本)之间添加了implements子句。设备上的.class文件没有该接口的implements,但您的代码正在尝试调用它。这是一个例子:

// data is declared as T, and the class is generic with <T extends Closeable>
// ParcelFileDescriptor implements Closeable, but only above 4.1.1_r1
data.close();
this     //    3    7:aload_0         
.data    //    4    8:getfield        #18  <Field Closeable data>
.close() //    5   11:invokeinterface #19  <Method void Closeable.close()>
// so if you compiled the above on 4.4 and use it on 3.0 it should throw the same error
// when the data variable contains a ParcelFileDescriptor instance

您可以尝试消除可能的行:

忽略内部类,因为堆栈对于那些不同,并忽略构造函数和原始操作:

super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);     
getWindowManager().getDefaultDisplay().getMetrics(dm);
setContentView(R.layout.password_activity_hvga);
setContentView(R.layout.password_activity);

GoogleAnalyticsTracker tracker = GoogleAnalyticsTracker.getInstance();;
tracker.startNewSession("UA-xxxxxxx-1", this);
tracker.trackPageView("Password");
tracker.dispatch();

m_res = getResources();

final Typeface face = Typeface.createFromAsset(getAssets(), "fonts/Cicle Semi.otf");     

m_passwrdErrorText  = (TextView) findViewById(R.id.txt_error_message);
m_passwrdErrorText.setTypeface(face);
m_passwrdEditText  = (EditText) findViewById(R.id.txt_edit_passwrd);
m_passwrdEditText.setOnClickListener(...);
m_passwrdEditText.setTypeface(face);
m_passwrdEditText.setOnKeyListener(...);

从剩下的内容中,您可以消除this次调用和类型化的(TextView / EditText非接口)调用,这样就离开了:

getWindowManager().getDefaultDisplay().getMetrics(dm);

GoogleAnalyticsTracker tracker = GoogleAnalyticsTracker.getInstance();;
tracker.startNewSession("UA-xxxxxxx-1", this);
tracker.trackPageView("Password");
tracker.dispatch();

final Typeface face = Typeface.createFromAsset(getAssets(), "fonts/Cicle Semi.otf");     

它也可能是被淘汰的人之一。最好的方法是在与报告的设备具有相同版本的模拟器或真实设备上重现并查看哪一行,但如果不可能,您可以尝试反编译.class文件并查找{{1这个方法中的说明,可以很好地缩小范围。

答案 4 :(得分:0)

就我而言:

class MyThread<T extends Closeable> extends Thread {
}

用作MyThread<DatagramSocket>: 在19 {a}之前的Android API级别DatagramSocket不是CloseableRead more.