2015-02-07 84 views
1

我有一个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

请看看第二个代码。在那里它不会调用'get()',而是用数据调用'onFinish'。 – Gofilord 2015-02-07 18:44:45

回答

1

您可以改为利用中的AsyncTask UI线程。如果您运行该线程中的代码来加载图像,则程序的其余部分不必等待。

使用此documentation了解更多信息。您可以使用onPostExecute()方法或onProgressUpdate()方法,而不是在后台线程中导致等待。

主线程与UI线程相同。你应该使用它来改变你的用户界面。这是为了让你的应用程序在执行后台代码之前不会等待图形加载,而是同时进行。为了使用AsyncTask中的ImageView,如果AsyncTask是一个子类并在执行之前实例化,则可以使ImageView成为全局。否则,将其作为参数传递给AsyncTask。

+0

感谢您的快速回答。我其实想到了这一点,但是我从某个地方读到,UI的变化只能从主线程完成。这不是问题吗? – Gofilord 2015-02-07 18:47:45

+0

@Gofilord onPostExecute方法在UI线程上运行。onPostExecute的目的是发布必须在UI线程上完成的结果(例如更新视图层次结构或设置文本视图中的文本)。 – 2015-02-07 18:48:26

+0

主线程是UI线程。很抱歉混淆,但你应该使用它来改变你的用户界面。这是为了让你的应用程序在执行后台代码之前不会等待图形加载,而是同时进行。 – apoorvk 2015-02-07 18:50:53

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); 
    } 
} 

希望的代码片段有助于

相关问题