在onPostExecute
内运行http请求的最佳方法是什么?
我尝试执行的行是:
Bitmap bmp = BitmapFactory.decodeStream(new URL(imgData[i][0]).openStream());
但是,它会抛出networkOnMainThreadException
,但我需要它在onPostExecute
部分运行。这样做的最佳方式是什么?
我需要它来访问主线程上的UI,因为这是该部分的样子:
单击某个项目时,您可以看到它为其添加意图的代码块,它需要访问最初创建它以启动Web浏览器的主线程。
否则会弹出错误:Only the original thread that created a view hierarchy can touch its views
for (int i = 0; i < 3; i++) {
try {
// set the URL of the image
iv.setURL(imgData[i][1]);
if (imgData[i][0] == null) {
imgData[i][0] = "http://website..co.uk/images/url.jpg";
}
Bitmap bmp = BitmapFactory.decodeStream(new URL(imgData[i][0]).openStream());
iv.setImageBitmap(bmp);
iv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(iv.getURL()));
startActivity(browserIntent);
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
答案 0 :(得分:0)
尝试这样的事情:
public class MyAsyncTask extends AsyncTask<Void, Void, List<Bitmap>> {
@Override
protected List<Bitmap> doInBackground(Void... params) {
// code load the images ...
List<Bitmap> result = new ArrayList<Bitmap>();
for (int i = 0; i < 3; i++) {
try {
// set the URL of the image
iv.setURL(imgData[i][1]);
if (imgData[i][0] == null) {
imgData[i][0] = "http://website..co.uk/images/url.jpg";
}
Bitmap bmp = BitmapFactory.decodeStream(new URL(imgData[i][0]).openStream());
result.add(bmp);
} catch (Exception e) {
e.printStackTrace();
}
}
return result;
}
@Override
protected void onPostExecute(List<Bitmap> params) {
for (int i = 0; i < 3; i++) {
iv.setImageBitmap(bmp);
iv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(iv.getURL()));
startActivity(browserIntent);
}
});
}
}
}
这将在后台线程中加载图像并在ui线程中设置图像位图。