执行AsyncTask时用户界面冻结。

问题描述 投票:-2回答:3

我使用AsyncTask从sever下载图像,但当调用 downloadImage() 从业 onCreate() 活动冻结,直到AsyncTask完成下载图片。

我正在使用这段代码。

  Bitmap downloadImage() {
        ImageDownloader task = new ImageDownloader();
        Bitmap myImage;

        try {
            myImage = task.execute("https://drive.google.com/uc?id=0B51TujFYa0RBUUYzSE15WHZRR3c").get();

            downloadedImg.setImageBitmap(myImage);

        } catch (Exception e) {
            e.printStackTrace();
        }
        Log.i("Interaction", "Button Tapped");

        return myImage
   }



    public class ImageDownloader extends AsyncTask<String, Void, Bitmap> {

        @Override
        protected Bitmap doInBackground(String... urls) {
            try {
                URL url = new URL(urls[0]);
                HttpURLConnection connection = (HttpsURLConnection) url.openConnection();
                connection.connect();

                InputStream inputStream = connection.getInputStream();
                //to convert Image from string data to bitmap
                Bitmap myBitmap = BitmapFactory.decodeStream(inputStream);

                return myBitmap;

            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
    }
android user-interface android-studio android-asynctask
3个回答
3
投票

你没有正确使用 AysncTask 类。通过调用 get(),你暂停你的主线,直到图片下载完毕。这就是为什么UI感觉很慢。

相反,你应该将图片从任务的 onPostExecute 方法。

private Toolbar toolbar;
private ImageView downloadedImg;

@Override
protected void onCreate(Bundle savedInstanceState) {

    // ... omitted ...

    ImageDownloader task = new ImageDownloader();    
    task.execute("https://drive.google.com/uc?id=0B51TujFYa0RBUUYzSE15WHZRR3c");

}

// ... omitted ...    

public class ImageDownloader extends AsyncTask<String, Void, Bitmap> {

    @Override
    protected Bitmap doInBackground(String... urls) {
        try {
            URL url = new URL(urls[0]);
            HttpURLConnection connection = (HttpsURLConnection) url.openConnection();
            connection.connect();

            InputStream inputStream = connection.getInputStream();
            //to convert Image from string data to bitmap
            Bitmap myBitmap = BitmapFactory.decodeStream(inputStream);

            return myBitmap;

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    protected void onPostExecute(Bitmap result) {

        downloadedImg.setImageBitmap(result);
    }
}

1
投票

你必须异步进行,而不是在主活动中进行,否则页面会被阻止,直到下载完成。有很多选项可以做到这一点。我认为最好的方法是在这个问题的公认答案中指出的。

安卓:使用Asynctask从网络上加载图片


1
投票

如果你查看async任务的文档,你会发现 get() 有以下描述

必要时等待计算完成,然后检索结果。

而不是调用 get() 你应该实施 onPostExecute 的AsyncTask子类中,并在那里处理你的图像。在android开发者页面上甚至有一个例子。

public class ImageDownloader extends AsyncTask<String, Void, Bitmap> {
   <...>

   @Override
   protected void onPostExecute(Bitmap result) {
      downloadedImg.setImageBitmap(result);
   }
}
© www.soinside.com 2019 - 2024. All rights reserved.