NullPointerException 与 android AsyncTask 和 RecyclerView
Posted
技术标签:
【中文标题】NullPointerException 与 android AsyncTask 和 RecyclerView【英文标题】:NullPointerException with android AsyncTask and 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。 我做了同样的错误 【参考方案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 的局部变量以上是关于NullPointerException 与 android AsyncTask 和 RecyclerView的主要内容,如果未能解决你的问题,请参考以下文章
Quartz:ERROR threw an unhandled Exception
NullPointerException 与 android AsyncTask 和 RecyclerView
NullPointerException 与 Hibernate criteriaQuery 间歇性发生
将 Kotlin 属性委托与 by 一起使用时出现 NullPointerException (NPE)
if(null check)-else 与 try catch(NullPointerException) 哪个更有效?
Apache Shiro 与 Spring MVC AuthorizingRealm @Autowired java.lang.NullPointerException