我想知道如何暂停,取消此功能,以便关闭正在运行的Activity。
public class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
ImageView bmImage;
public DownloadImageTask(ImageView bmImage) {
this.bmImage = bmImage;
}
protected Bitmap doInBackground(String... urls) {
String urldisplay = urls[0];
Bitmap mIcon11 = null;
try {
InputStream in = new java.net.URL(urldisplay).openStream();
mIcon11 = BitmapFactory.decodeStream(in);
} catch (Exception e) {
Log.e("Error", e.getMessage());
e.printStackTrace();
}
return mIcon11;
}
protected void onPostExecute(Bitmap result) {
bmImage.setScaleType(ImageView.ScaleType.FIT_XY);
bmImage.setImageBitmap(result);
}}
如何调用该函数来取消AsyncTask和InputStream
答案 0 :(得分:0)
如果您正在进行计算:
您必须定期检查isCancelled()
。
如果您正在执行HTTP请求:
将HttpGet
或HttpPost
的实例保存在某处(例如公共字段)。
致电取消后,请致电request.abort()
。这会导致IOException
被doInBackground
引入AsyncTask
。
就我而言,我有一个连接器类,我在各种abortAllRequests
中使用过。为了简单起见,我在该类中添加了一个新的{{1}}方法,并在调用cancel后直接调用了此方法。
答案 1 :(得分:0)
要取消位图加载,您可以使用requestCancelDecode
的{{1}}方法。保留对Options对象的引用,并将其传递给BitmapFactory.Options
方法。然后,您可以在对象上调用decodeStream
来取消请求。 Android确实显示calling the method does not guarantee that decoding actually gets cancelled。
答案 2 :(得分:0)
只要你想取消asynctask只需要一个静态变量,只需输入静态变量并在dobackground中返回它。这是使用线程最安全的方法
protected Bitmap doInBackground(String... urls) {
if(cancel)
{
return;
}
String urldisplay = urls[0];
Bitmap mIcon11 = null;
try {
InputStream in = new java.net.URL(urldisplay).openStream();
// ByteArrayOutputStream
ByteArrayOutputStream out = new ByteArrayOutputStream(4048);
// buffer
byte[] buffer = new byte[4048];
int bytesRead = -1;
// isCancelled() == false is Important
while ((isCancelled() == false) && (bytesRead = in.read(buffer)) != -1) {
out.write(buffer, 0, bytesRead);
}
byte[] imageBytes = out.toByteArray();
// Decode Bitmap from imageBytes
if (isCancelled() == false) {
mIcon11 = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length);
}
} catch (Exception e) {
Log.e("Error", e.getMessage());
e.printStackTrace();
}
return mIcon11;
}