我有一个单独的类(不是 Activity)来管理图像及其属性。
在这个类(Image.class)中,我还创建了一个 AsynkTask 来从网络下载位图。 一切正常,除了 AsyncTask 继续运行,没有触发 onPostExecute() 方法。
有人可以帮我吗?
我在主 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;
}
}
}
最佳答案
您对线程的工作方式存在误解。您正在使用异步调用,然后忙于等待它完成。
// --- 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 加载器。我确信这段代码已经被写了一千遍了。如果您不了解线程和异步编程,您可以直接复制它。
关于java - onPostExecute 未运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28247633/