![](/img/trans.png)
[英]AsyncTask onProgressUpdate doesn't change UI in the UI-Thread immediately
[英]onProgressUpdate() for AsyncTask class doesn't work
我想显示进度条,其中下载了图像并设置了自定义颜色,我在onProgressUpdate()中进行了设置,但它确实起作用,它也没有出现在logcat中。它也显示白屏,直到下载完成,并且如果我在下载,它将崩溃。
我的代码:
public class DownloadImage extends AsyncTask<String ,Void, Bitmap> {
Bitmap bit;
@Override
protected Bitmap doInBackground(String... urls) {
try {
URL url = new URL(urls[0]);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.connect();
return BitmapFactory.decodeStream(connection.getInputStream());
} catch(Exception e){
Log.i("error download", "doInBackground: "+e.getMessage());
}
return null;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
Log.i("download", "onPostExecute: ");
imageView.setImageBitmap(bitmap);
progressBar.setVisibility(View.GONE);
}
@Override
protected void onProgressUpdate(Void... values) {
Log.i("download", "onProgressUpdate: ");
imageView.setColorFilter(R.color.imagecolor);
}
}
和onCreate()方法:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
imageView = findViewById(R.id.imageView2);
progressBar = findViewById(R.id.progressBar2);
DownloadImage downloadImage = new DownloadImage();
downloadImage.execute("https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRaL6woz3RgMF-UXU682S_BYb1ayl5xaVancp0PPvF2HnCDmPsb");
try {
downloadImage.get();
} catch (Exception e){
}
}
我想显示进度条,其中下载了图像并设置了自定义颜色,我在onProgressUpdate()中进行了设置,但确实有效
你需要调用publishProgress()
从doInBackground()
这将触发对onProgressUpdate()
调用。 您没有这样做,因此不会调用onProgressUpdate()
。
它还显示白屏,直到下载完成
删除您的downloadImage.get();
呼叫。 这将阻塞主应用程序线程,而使用AsyncTask
(或更现代的替代品)的目的是不阻塞主应用程序线程。
如果在下载过程中按返回按钮,它将崩溃。
如果活动/片段被破坏,则不应更新UI。 因此,您需要在onPostExecute()
确认更新UI是否安全(例如,在活动上调用isDestroyed()
)。
除此之外, 使用Logcat检查与任何崩溃相关的堆栈跟踪 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.