我正在使用Gilles Debunne在Multithreading For Performance中描述的ImageDownloader,我想做一个简单的扩展。
我想为尚未下载的每个列表项添加一个不确定的ProgressBar
。我现在主要通过以下方式进行设置:
progressBar.setVisibility(View.VISIBLE); // in the AsyncTask preExecute()
progressBar.setVisibility(View.INVISIBLE); // in the AsyncTask postExecute()
具体来说,只要在postExecute()
中设置了imageView的位图,我就会将进度条标记为不可见......就像这样:
if (this == bitmapDownloaderTask) {
imageView.setImageBitmap(bitmap);
progBar.setVisibility(View.INVISIBLE);
}
但是我无法找到最初在preExecute()
中显示进度条的正确测试。我尝试了各种组合:
if (imageView == null)
if (imageView.getDrawingCache() == null)
if (downloadedDrawable == null)
if (downloadedDrawable.getColor() == Color.BLACK)
有没有人建议如何使这项工作?那就是:对于此代码确定给定位图是否设置的正确测试是什么?谢谢!
答案 0 :(得分:0)
为什么imageView在preExecute中为null,这意味着你为什么需要测试?好的,在您引用的博客中,它使用了对图像视图的弱引用。你在onPostExecute中测试它是否为null:
ImageView imageView = imageViewReference.get();
if (imageView != null) {
这种情况发生的唯一方法是,如果AsyncTask没有启动,但包含图像视图的Activity已经完成并从屏幕中移除,这是可能的,因此测试它是好的。如果为null,则应立即调用cancel。
downloadExrawable(例如位图)在preExecute中不存在,因为尚未下载。
您的测试:
if (this == bitmapDownloaderTask) {
似乎多余。什么时候不是bitmapDownloaderTask?
[编辑]但是为什么你需要测试imageview来显示进度条?为什么不在onPreExecute中显示它(如果没有取消)并将其隐藏在onPostExecute中?