gpt4 book ai didi

Android:如何等待 AsyncTask 在 MainThread 中完成?

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:52:31 24 4
gpt4 key购买 nike

我知道您首先要做的是...为什么您要使用 AsyncTask。

这是我的问题,我正在开发一些 Android 应用程序(适用于 Android 2.1 或更高版本的 API 7),我正在模拟器上进行测试,一切正常,所以我在 HTC Sensation 上进行了测试,它显示 NetworkOnMainThreadExeption!

我正在下载一些图片,然后在 map 上绘制。

所以为了解决这个问题,每次(互联网连接)在这种情况下下载图片我必须放在 AsyncTask 上才能工作。

所以我需要一种方法来知道何时完成所有图片以便我可以开始绘图..

我试了很多,但没有结果,我不知道。我得到了一个带有处理程序的解决方案,但如果在较慢的网络上运行,我会得到空指针(因为图片未下载)。

所以请帮助我。

编辑:

思路是这样的:

Bitmap bubbleIcon ;
onCreate(){
...
// i am making call for Async
new ImgDown().execute(url);
//and then i calling functions and classes to draw with that picture bubbleIcon !
DrawOnMap(bubbleIcon);
}




//THIS IS ASYNC AND FOR EX. SUPPOSE I NEED TO DOWNLOAD THE PIC FIRST
class ImgDown extends AsyncTask<String, Void, Bitmap> {

private String url;

public ImgDown() {
}

@Override
protected Bitmap doInBackground(String... params) {
url = params[0];
try {
return getBitmapFromURL(url);
} catch (Exception err) {
}

return null;

}

@Override
protected void onPostExecute(Bitmap result) {
bubbleIcon = result;
bubbleIcon = Bitmap
.createScaledBitmap(bubbleIcon, 70, 70, true);

}

public Bitmap getBitmapFromURL(String src) {
try {
Log.e("src", src);
URL url = new URL(src);
HttpURLConnection connection = (HttpURLConnection) url
.openConnection();
connection.setDoInput(true);
connection.connect();
InputStream input = connection.getInputStream();
// /tuka decode na slika vo pomalecuk kvalitet!
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 3;
Bitmap myBitmap = BitmapFactory
.decodeStream(new FlushedInputStream(input));
Log.e("Bitmap", "returned");
return myBitmap;
} catch (IOException e) {
e.printStackTrace();
Log.e("getBitmapFromURL", e.getMessage());
return null;
}
}

class FlushedInputStream extends FilterInputStream {
public FlushedInputStream(InputStream inputStream) {
super(inputStream);
}

public long skip(long n) throws IOException {
long totalBytesSkipped = 0L;
while (totalBytesSkipped < n) {
long bytesSkipped = in.skip(n - totalBytesSkipped);
if (bytesSkipped == 0L) {
int byteValue = read();
if (byteValue < 0) {
break; // we reached EOF
} else {
bytesSkipped = 1; // we read one byte
}
}
totalBytesSkipped += bytesSkipped;
}
return totalBytesSkipped;
}
}
}

我希望现在更清楚了。

最佳答案

class OpenWorkTask extends AsyncTask {

@Override
protected Boolean doInBackground(String... params) {
// do something
return true;
}

@Override
protected void onPostExecute(Boolean result) {
// The results of the above method
// Processing the results here
myHandler.sendEmptyMessage(0);
}

}

Handler myHandler = new Handler() {

@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 0:
// calling to this function from other pleaces
// The notice call method of doing things
break;
default:
break;
}
}
};

关于Android:如何等待 AsyncTask 在 MainThread 中完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13079645/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com