过去几天我一直在试图在我的Android应用程序中的一个OnLickListener事件(我老实说不知道哪个)中调试一个非常奇怪的Java NullPointerException。
我的应用程序已在Play商店中发布,并启用了Firebase崩溃报告,这是我对该错误的任何详细信息的来源,Firebase报告了以下堆栈跟踪:
Exception java.lang.NullPointerException:
package.name.activity.QuoteList$1.onClick (QuoteList.java)
android.view.View.performClick (View.java:4439)
android.widget.ImageButton.performClick (ImageButton.java:105)
android.view.View$PerformClick.run (View.java:18395)
android.os.Handler.handleCallback (Handler.java:725)
android.os.Handler.dispatchMessage (Handler.java:92)
android.os.Looper.loop (Looper.java:176)
android.app.ActivityThread.main (ActivityThread.java:5317)
java.lang.reflect.Method.invokeNative (Method.java)
java.lang.reflect.Method.invoke (Method.java:511)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1102)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:869)
dalvik.system.NativeStart.main (NativeStart.java)
出于隐私原因,我已将应用程序的包名重命名为堆栈跟踪中的“package.name”。
问题已发生在不同用户的50多次,但我注意到它只出现在API 17版本的Android 4.2.2中,其他用户使用其他Android版本似乎不受影响。
正如您在堆栈跟踪中看到的,它没有提到QuoteList.java中的任何特定行,但只提示QuoteList $ 1,但我不明白$ 1的含义,请向我解释。
这是我有2个听众的代码:
btn_expand.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (adapter.isExpand()) {
adapter.setExpand(false);
adapter.notifyDataSetChanged();
btn_expand.setImageResource(R.drawable.actionbar_ic_resize);
btn_expand.setAdjustViewBounds(true);
} else {
adapter.setExpand(true);
adapter.notifyDataSetChanged();
btn_expand.setImageResource(R.drawable.actionbar_ic_resize_pressed);
btn_expand.setAdjustViewBounds(true);
}
}
});
btn_logo.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(getApplicationContext(), MainActivity.class);
startActivity(i);
QuoteList.this.finish();
}
});
我希望有人可以帮我解决这个问题,谢谢你的帮助。
答案 0 :(得分:0)
解决了!问题是,在某些情况下,在OnClickListener
中设置adapter
对象之前调用了第一个onPostExecute()
,而onCreate()
中定义了监听器这是在AsyncTask启动之前执行的。当然导致NullPointerException
。
因此解决方案是在将OnClickListener
设置为新的Adapter对象之后,将上述onPostExecute()
侦听器简单地移动到adapter
。
当您开始在Activity类中混合AsyncTask类并且忘记首先执行的操作时,很容易忽略这样的事情。所以我希望这个答案可以帮助将来的某个人。