我有一个单独的类(不是活动)来管理带有属性的图像。
在这个类(Image.class)中,我还创建了一个AsynkTask来从Web下载位图。 一切正常,除了AsyncTask继续运行,而不触发onPostExecute()方法。
有人可以帮助我吗?
我在一个循环内的Main Activity中实例化这个类。
public class InstaImage {
public URL thumbUrl;
public URL lowresUrl;
public URL standardresUrl;
private URL url;
private Bitmap bmp;
public InstaImage(URL _thumb, URL _low, URL _standard ) {
this.thumbUrl = _thumb;
this.lowresUrl = _low;
this.standardresUrl = _standard;
}
public Bitmap getBitmap(String resolution) {
switch(resolution) {
case "thumb":
url = thumbUrl;
break;
case "low":
url = lowresUrl;
break;
case "standard":
url = standardresUrl;
break;
}
DownloadImageTask dit = new DownloadImageTask();
dit.execute();
// --- TEST ASYNC STATUS ---
while(dit != null) {
if(dit.getStatus() == AsyncTask.Status.FINISHED) {
Log.i("ASYNC", "END2!!");
break;
}
else {
Log.w("ASYNC WAITING", dit.getStatus().toString());
}
}
// --- END TEST ASYNC STATUS ---
return bmp;
}
private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
URLConnection conn = null;
InputStream in = null;
Bitmap _bmp = null;
@Override
protected Bitmap doInBackground(String... urls) {
Log.i("ASYNC","STARTING!!");
try {
conn = url.openConnection();
if (conn != null) {
in = conn.getInputStream();
_bmp = BitmapFactory.decodeStream(in);
in.close();
}
}
catch (IOException e) {
e.printStackTrace();
}
Log.i("ASYNC","END0!!");
return _bmp;
}
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
Log.i("ASYNC","END1!!");
bmp = result;
}
}
}
答案 0 :(得分:0)
您对线程的工作方式存在误解。您正在使用异步调用,然后忙着等待它完成。
// --- TEST ASYNC STATUS ---
while(dit != null) {
if(dit.getStatus() == AsyncTask.Status.FINISHED) {
Log.i("ASYNC", "END2!!");
break;
}
else {
Log.w("ASYNC WAITING", dit.getStatus().toString());
}
}
// --- END TEST ASYNC STATUS ---
return bmp;
抱歉,您可能需要阅读一些主题。
我建议创建一个类InstaImageView extends ImageView
并在其中添加一个异步URI加载器。我确定这段代码写了一千遍。如果你不了解线程和异步编程,你可以复制它。
答案 1 :(得分:-1)
为什么你从doInBackground功能返回?
return _bmp; //不需要回到这里 //结果将自动传递给onPostExcute()