OnClick

时间:2017-03-22 12:00:21

标签: java android nullpointerexception

过去几天我一直在试图在我的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();
    }
});

我希望有人可以帮我解决这个问题,谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

解决了!问题是,在某些情况下,在OnClickListener中设置adapter对象之前调用了第一个onPostExecute(),而onCreate()中定义了监听器这是在AsyncTask启动之前执行的。当然导致NullPointerException

因此解决方案是在将OnClickListener设置为新的Adapter对象之后,将上述onPostExecute()侦听器简单地移动到adapter

当您开始在Activity类中混合AsyncTask类并且忘记首先执行的操作时,很容易忽略这样的事情。所以我希望这个答案可以帮助将来的某个人。