我想编写一个从对象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/
获取图片答案 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();
答案 2 :(得分:0)
您需要在后台线程中执行此操作。请参阅我的代码答案 File Upload to server issues in Android