我有一个AsyncTask
获取一个URL作为参数,并在完成后从该URL返回一个Bitmap
图像。当我开始活动时,我想显示一个文本(而不是图像)说"加载...",在后台运行ImageFetcher
,当它完成时,设置图像到ImageView
。
问题是,如果我跑:
ivPoster.setImageBitmap(imgFetcher.execute(m.getPosterUrl()).get());
在加载图像之前,它不会加载整个活动。它会跳过帧。
所以我在任务上设置了一个完成侦听器,返回位图,并尝试在检索位图后设置图像:
imgFetcher.setOnFinishListener(new OnTaskFinished() {
@Override
public void onFinish(Bitmap bm) {
// hide the loading image text
tvLoading.setVisibility(View.INVISIBLE);
// place the image
ivPoster.setImageBitmap(bm);
}
});
imgFetcher.execute(m.getPosterUrl());
然而,它仍然会跳过框架并且在主线程上做了太多工作' 如何防止跳帧?
答案 0 :(得分:1)
您可以使用AsyncTask中的UI线程。如果您运行该线程中的代码来加载图像,则程序的其余部分将不必等待。
使用此documentation获取更多信息。您可以使用onPostExecute()
方法或onProgressUpdate()
方法,而不是在后台线程中导致等待。
主线程与UI线程相同。您应该使用它来在UI中进行更改。这样,您的应用程序不会在执行后台代码之前等待图形加载,而是同时执行它们。为了使用AsyncTask中的ImageView,如果AsyncTask是子类并在执行之前实例化,则可以使ImageView成为全局。否则,将其作为参数传递给AsyncTask。
答案 1 :(得分:1)
private class ImageDownloaderTask extends AsyncTask<String, Void, Bitmap> {
ImageView mImageView;
String mUrl;
public ImageDownloaderTask(ImageView imageview, String url) {
this.mImageView = imageview;
this.mUrl = url;
}
@Override
protected Bitmap doInBackground(String... params) {
//Download here
}
@Override
// Once the image is downloaded, associate it to the imageView
protected void onPostExecute(Bitmap bitmap) {
mImageView.setImageBitmap(bitmap);
}
}
希望代码段有帮助
答案 2 :(得分:0)