【问题标题】:NullPointerException with android AsyncTask and RecyclerViewNullPointerException 与 android AsyncTask 和 RecyclerView
【发布时间】:2020-02-11 12:46:35
【问题描述】:

我有一个 AsyncTask 类来从网络下载图像并将其设置到ImageView(引用自here)

相关活动代码:

    public class ListAdoptions extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_list_adoptions);

            recyclerView = (RecyclerView) findViewById(R.id.recycler_view);

            mAdapter = new PetsAdapter(petList);
            RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
            recyclerView.setLayoutManager(mLayoutManager);
            recyclerView.setItemAnimator(new DefaultItemAnimator());
            recyclerView.setAdapter(mAdapter);

            preparePetData();
        }


        private void preparePetData() {

            DownloadImageTask imgtask = new DownloadImageTask((ImageView) findViewById(R.id.picture));
            imgtask.execute("https://i.ytimg.com/vi/opKg3fyqWt4/hqdefault.jpg");

            mAdapter.notifyDataSetChanged();
        }

        private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
            ImageView bmImage;

            public DownloadImageTask(ImageView bmImage) {
                this.bmImage = bmImage;
            }

            protected Bitmap doInBackground(String... urls) {
                String urldisplay = urls[0];
                Bitmap mIcon11 = null;
                try {
                    InputStream in = new java.net.URL(urldisplay).openStream();
                    mIcon11 = BitmapFactory.decodeStream(in);
                } catch (Exception e) {
                    Log.e("Error", e.getMessage());
                    e.printStackTrace();
                }
                return mIcon11;
            }

            protected void onPostExecute(Bitmap result) {
                bmImage.setImageBitmap(result);
            }
        }
    }

错误:

Process: com.example.test3, PID: 8427
    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setImageBitmap(android.graphics.Bitmap)' on a null object reference
        at com.example.petadoption.ListAdoptions$DownloadImageTask.onPostExecute(ListAdoptions.java:171)
        at com.example.petadoption.ListAdoptions$DownloadImageTask.onPostExecute(ListAdoptions.java:150)
        at android.os.AsyncTask.finish(AsyncTask.java:695)
        at android.os.AsyncTask.-wrap1(Unknown Source:0)
        at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:712)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6541)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

【问题讨论】:

  • 是的,我对 JAVA 和 android 很陌生(一天大)所以请不要评判 x(
  • 强烈推荐使用标准图片加载库,如Glide或Coil
  • @AjahnCharles 我在滑行时遇到了同样的错误“参数不能为空”
  • 我的意思是完全替换 AsyncTask。您应该从 RV Adapter/ViewHolder 调用 Glide。
  • 我做了同样的错误

标签: java android android-recyclerview nullpointerexception android-asynctask


【解决方案1】:

您的bmImage 似乎始终为空。很可能findViewById(R.id.picture) 始终为空。确保您在 XML 布局文件中定义了 ID 为“图片”的 ImageView,并且没有错过加号。 android:id="@+id/picture"

【讨论】:

    【解决方案2】:

    看不到整个代码,但消息是空对象... 确保您在 ListAdoptions 中定义了 bmImage,例如 findViewById(R.id.bmImage) 并检查此对象是否存在于 xml 中,id 为 bmImage

    【讨论】:

    • bmimage 是 asynctask 的局部变量
    【解决方案3】:

    处理null时要做的事情:

    • 确保名称拼写正确
    • 添加 if 语句以查看何时变为空
    • 使用调试器并单步执行您的代码以查看对象为空的原因

    由于某种原因 bmImage 不存在,我建议您查看您的布局和此类本身以找到 null

    【讨论】:

    • bmImage 是 asynctask 的局部变量
    猜你喜欢
    • 2016-11-20
    • 1970-01-01
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    • 2013-10-22
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多