在 android 中将图像下载到位图文件中

Download an image into Bitmap file in android

我一直在尝试将图像下载到位图元素中,以便将它们加载到带有图像的 gridView 中,但我需要异步进行,因为如果不这样做,就会出现错误 "android.os.NetworkOnMainThreadException"。

通过搜索,我发现有很多教程可以做到这一点,但所有教程都在完成后将此元素添加到 ImageView。 除了位图,还有什么办法可以做到这一点吗?

这里我找到了不用异步下载的方法:

URL url = new URL("http://....");
Bitmap image = BitmapFactory.decodeStream(url.openConnection().getInputStream());

还有一个:

public static Bitmap getBitmapFromURL(String src) {
    try {
        URL url = new URL(src);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setDoInput(true);
        connection.connect();
        InputStream input = connection.getInputStream();
        Bitmap myBitmap = BitmapFactory.decodeStream(input);
        return myBitmap;
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}

Android load from URL to Bitmap

将您的 getBitmapFromURL 方法包装成 AsyncTask,见下文:

private class GetBitmapFromURLAsync extends AsyncTask<String, Void, Bitmap>   {
    @Override
    protected Bitmap doInBackground(String... params) {
        return getBitmapFromURL(params[0]);
    }

    @Override
    protected void onPostExecute(Bitmap bitmap) {
    }
}

将上述 AsyncTask 嵌套到您的 Activity:

public class MyActivity extends Activity {
  // To store the Bitmap returned by doInBackground asynctask
  private Bitmap result;
  // existing Activity code
  ...

  private class GetBitmapFromURLAsync extends AsyncTask<String, Void, Bitmap>   {
    @Override
    protected Bitmap doInBackground(String... params) {
      return getBitmapFromURL(params[0]);
    }

    @Override
    protected void onPostExecute(Bitmap bitmap) {
      //  return the bitmap by doInBackground and store in result
      result = bitmap;
    }
}

并调用上面的代码:

GetBitmapFromURLAsync getBitmapFromURLAsync = new GetBitmapFromURLAsync();
getBitmapFromURLAsync.execute("http://....");

您不能在 android 中从主 (UI) 线程进行诸如 http 请求之类的繁重操作。或者你会得到那个错误。您可以使用 AsyncTask.

class ImageDownloadTask extends AsyncTask<String, Void, Bitmap>   {

    //this operation is in backgrouund
    @Override
    protected Bitmap doInBackground(String... params) {
        return getBitmapFromURL(params[0]);
    }

    //operation is finished, update the UI with bitmap
    @Override
    protected void onPostExecute(Bitmap bitmap) {
    }
}

或者只使用 Picasso 库,它会为您完成所有工作,包括缓存。

Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);