我希望这(在getView()
内)能够正常工作......
但没有任何反应,位图没有加载到ImageView ....
Thread th= new Thread(new Runnable() {
@Override
public void run() {
ImageLoader.getInstance().displayImage(rss.getChannel().getItems().get(position).getEnclosure().getUrl(),holder.imageView,options,new ImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
//...stuff...
}
//... more stuff
@Override
public void onLoadingCancelled(String imageUri, View view) {
//...stuff
}
});
}
});
th.start();
请问为什么不是???
谢谢: - )
答案 0 :(得分:4)
你试图做的是非常糟糕的做法。但是,我无法从您提供给我们的信息中告诉您问题是什么。 我认为ImageLoading库已经在自己的线程中处理,因此你的Thread已经完成了。此外,只有主UI线程可以访问或操作UI视图,但如果这是问题,则应该抛出异常。
此外,我建议您使用Picasso。它处理Threadpooling,调度,缓存,内存管理(通过使用WeakReference避免内存泄漏)和ListView或RecyclerView中的回收视图。
<强>更新强>
每次滚动时都会调用Thread
来创建getView()
。这是不好的做法,因为创建Thread
是很昂贵的。考虑投掷或快速滚动列表。如果滚动20个元素,将创建并启动20个线程。所有的都具有与主UI线程相同的优先级。这意味着CPU在20个线程和主UI线程之间共享。这可能会导致糟糕的UI性能。您应该使用ThreadPool
。此外,你不会停止你的线程。这带来了两个问题:
getView()
中被回收,而线程不是,因此线程仍然在运行,而视图应该显示另一个项目。 Adapter
类。 Adapter
已附加到ListView
,ListView
附加到Activity
。因此,如果您的Activity被用户关闭,垃圾收集器就无法收集Activity以及所有视图和其他对象,直到完成Thread(或者在您的情况下,所有线程)。你可能内存不足。最后但并非最不重要的是,Android系统有自己的基于消息队列的线程系统,只有主UI线程可以访问UI视图。我不想在这里深入细节,我相信你可以google它。此时我建议使用AsyncTask,如果你真的需要开始自己的线程。但是您还必须手动取消AsyncTask以避免内存泄漏。
答案 1 :(得分:1)
首先,Android应用程序UI未从工作线程更新或访问。所以你的Thread不会改变/访问Image。
其次,您不需要Thread
进行图片加载,因为您的ImageLoader
图书馆本身会处理它。
答案 2 :(得分:1)
只有 UIThread 才能更改其观看次数。我建议使用runOnUIThread()
中的Activity
方法。
更多信息:https://developer.android.com/training/multiple-threads/communicate-ui.html