从对象URL返回位图

时间:2016-10-07 16:45:30

标签: android json bitmap imageview

我想编写一个从对象URL返回Bitmap图像的方法。但是它会给出 NetworkOnMainThreadException 错误。

Image.java:

package gc.x.models;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.ImageView;

import com.google.gson.annotations.SerializedName;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import gc.x.R;


/**
 * Created by ASUS on 4.10.2016.
 */
public class Image {


    public String albumId;
    public String id;
    public String title;
    public String url;
    public String thumbnailUrl;


    public Bitmap getBitmapFromURL() {//get bitmap of thumbnail from thumbnailurl
        try {
            URL url = new URL(this.thumbnailUrl);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setDoInput(true);
            connection.connect();
            InputStream input = connection.getInputStream();
            Bitmap myBitmap = BitmapFactory.decodeStream(input);
            return myBitmap;
        } catch (IOException e) {
            // Log exception
            return null;
        }
    }


}

我不想简单地从url显示位图图像,因为代码结构不同。为了防止混淆,我没有共享我的所有代码。我只想编写一个从对象的缩略图获取位图的方法。后来,我将使用这种方法。我从http://jsonplaceholder.typicode.com/

获取图片

3 个答案:

答案 0 :(得分:2)

您无法在主线程中执行此网络任务,您必须在异步任务中写入此内容。

在类

中编写此代码
private class AsyncClass extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... params) {
        getBitmapFromURL();
    }

    @Override
    protected void onPostExecute(String result) {
    }

    @Override
    protected void onPreExecute() {
    }

    @Override
    protected void onProgressUpdate(Void... values) {
    }
}

并像这样称呼它

new AsyncClass().execute("");

答案 1 :(得分:0)

你的问题是你正在使用主线程进行网络操作......而且我建议使用图像加载框架来实现这个目标,即使用Glide ..用一行你有位图。你不需要解决mainThread ..因为Glide会为你解决这个问题。只需专注于你的代码。

Bitmap theBitmap = Glide.with(this).
                load("http://...."). // or url 
                asBitmap().
                into(100, 100). // Width and height
                get();

Glide:https://github.com/bumptech/glide

答案 2 :(得分:0)

您需要在后台线程中执行此操作。请参阅我的代码答案 File Upload to server issues in Android