5

从安卓市场,我得到了以下崩溃报告。我在测试我的应用程序时没有找到。车祸发生在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 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;
        }
    });
}

}

4

5 回答 5

1

我看到 2 份关于 Play 商店的报告,IncompatibleClassChangeError: interface not implemented但在Service类中出现异常,日志消息包含onStartCommand(Unknown Source). 我正在使用 Eclipse 构建发布的应用程序。

幸运的是,我室友的手机也遇到了同样的异常。阅读以下链接后:什么原因导致 java.lang.IncompatibleClassChangeError?,我修复它的方式(至少在我室友的手机上)是将 android-support-v4.jar 添加到项目的“libs”文件夹并添加到构建路径。然后在“Order and Export”下的项目“Java Build Path”部分,导出新添加的jar文件并删除导出“Android Private Libraries”的选择。

于 2014-04-26T07:56:31.020 回答
0

调查您的界面,实用程序

public class PasswordActivity extends Activity implements Utilities

使用这个接口需要实现哪些功能?

Eclipse 通常对这些问题有快速修复

于 2012-05-29T10:50:34.683 回答
0

一定是某种安装故障,重新安装可能会有所帮助,但恐怕你无法告诉用户。

于 2013-12-06T09:54:55.540 回答
0

就我而言,它是:

class MyThread<T extends Closeable> extends Thread {
}

用作MyThread<DatagramSocket>:在 19 之前的 Android API 级别DatagramSocket上不是一个Closeable. 阅读更多。

于 2015-04-27T09:34:49.480 回答
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 文件并invokeinterface在此方法中查找说明,这将缩小范围真的很好。

于 2014-09-25T23:17:19.520 回答