gpt4 book ai didi

android - 使用处理程序发布到 UI 线程

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:22:45 25 4
gpt4 key购买 nike

我正在开发一个 android 应用程序,它从 Internet 获取图像并显示在用户界面中。我正在使用 RecyclerView 来显示图像。我打算使用单独的线程下载图像。并通过处理程序更新 RecyclerView。我不知道这个概念是否正确,(我知道 AsyncTask,但出于学习目的,我正在尝试实现 Handler。) 所以我编码如下

private void loadNewsThumbnailImage(ArrayList<DataItem> dataList) {
for (DataItem item : DataList) { //DataItem is the model class
loadThumbnailFromInternet(item);
}
}



private void loadThumbnailFromInternet(final DataItem dataItem) {

Thread imageDowloaderThread = new Thread(new Runnable() {
@Override
public void run() {
Bitmap bitmap = null;
try {
bitmap = getDataItemBitmap(dataItem.getmImageUrl());
dataItem.setmThumbnail(bitmap);
new Handler().post(new Runnable() { // Tried new Handler(Looper.myLopper()) also
@Override
public void run() {
mAdapter.notifyDataSetChanged();
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
});
imageDowloaderThread.start();

}

我已经执行了这段代码,但出现错误,应用程序被终止,我不知道为什么会这样。请任何人帮我解决这个问题。并解释当前代码的问题是什么。

(请不要建议使用 AsyncTask(我已经试过了,效果很好))

更新

获取错误:java.lang.RuntimeException:无法在尚未调用 Looper.prepare() 的线程内创建处理程序

最佳答案

您的应用程序正在终止,因为您正在从非 UI 线程调用 notifyDataSetChanged()。

替换:

 new Handler().post(new Runnable() { // Tried new Handler(Looper.myLopper()) also
@Override
public void run() {
mAdapter.notifyDataSetChanged();
}
});

有了这个:

new Handler(Looper.getMainLooper()).post(new Runnable() { // Tried new Handler(Looper.myLopper()) also
@Override
public void run() {
mAdapter.notifyDataSetChanged();
}
});

关于android - 使用处理程序发布到 UI 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31824573/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com