Android:为什么getView()中的线程似乎不起作用?

时间:2015-02-12 17:44:12

标签: android

我希望这(在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();

请问为什么不是???

谢谢: - )

3 个答案:

答案 0 :(得分:4)

你试图做的是非常糟糕的做法。但是,我无法从您提供给我们的信息中告诉您问题是什么。 我认为ImageLoading库已经在自己的线程中处理,因此你的Thread已经完成了。此外,只有主UI线程可以访问或操作UI视图,但如果这是问题,则应该抛出异常。

此外,我建议您使用Picasso。它处理Threadpooling,调度,缓存,内存管理(通过使用WeakReference避免内存泄漏)和ListView或RecyclerView中的回收视图。

<强>更新

每次滚动时都会调用Thread来创建getView()。这是不好的做法,因为创建Thread是很昂贵的。考虑投掷或快速滚动列表。如果滚动20个元素,将创建并启动20个线程。所有的都具有与主UI线程相同的优先级。这意味着CPU在20个线程和主UI线程之间共享。这可能会导致糟糕的UI性能。您应该使用ThreadPool。此外,你不会停止你的线程。这带来了两个问题:

  1. 您的视图在getView()中被回收,而线程不是,因此线程仍然在运行,而视图应该显示另一个项目。
  2. 你得到内存泄漏!你知道Garbage Collection是如何工作的吗?它从线程级别开始,搜索未使用的对象(任何其他对象不再引用的对象)。你的线程是一个内部类。因此,它很难引用周围的Adapter类。 Adapter已附加到ListViewListView附加到Activity。因此,如果您的Activity被用户关闭,垃圾收集器就无法收集Activity以及所有视图和其他对象,直到完成Thread(或者在您的情况下,所有线程)。你可能内存不足。
  3. 最后但并非最不重要的是,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