gpt4 book ai didi

java - 即使使用取消方法也无法取消 AsyncTask 中的 doInBackground 进程

转载 作者:行者123 更新时间:2023-11-29 21:30:50 25 4
gpt4 key购买 nike

我已经在 onCreate() 方法中声明了扩展 AsyncTask 的 FileUploadTask 实例

                FileUploadTask uploadTask= null;

并通过以下代码执行后台方法

                    public class UploadFiles implements OnClickListener{

....

if(SOTCNetStat.chkConnectionStatus(UploadResult.this)){
uploadTask=new FileUploadTask();
uploadTask.execute("");
}
else
{
Toast.makeText(UploadResult.this, getResources().getString(R.string.Text_CheckNetworkConnections) , Toast.LENGTH_LONG).show();
}
....

}

有一个取消按钮来取消后台进程

                cancel.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Log.d(TAG,"cancel button clicked.....");
//FileUploadTask uploadTask= new FileUploadTask();
if(uploadTask!=null)
{
Log.d(TAG,"click event null checking....");
uploadTask.cancel(true);
}


}

}

在 FileUploadTask 类中声明了一个 boolean 值来检查运行状态

        public class FileUploadTask extends AsyncTask<String, Integer, String> {
....
boolean isRunning=true;

doInBackground 方法

    @Override
protected String doInBackground(String... arg0) {

for(int i=0; i<fp.size(); i++){
index = i+1;

if(isCancelled() && !isRunning)
{
Log.d(TAG,"Cancel 1 Condition Checked ["+i+"]");
Log.d(TAG,"doInBackground canceled");
break;

}
else
{
Log.d(TAG,"Cancel 1 Canceled ["+i+"]");
}

file1 = new File(fp.get(i));

String urlString = Constants.UPLOAD_URL;

try {

Log.e("doInBackground", "urlString: " + urlString);

Log.e("doInBackground", "domainPref: " + domainName);

urlString = urlString.replace("domain", URLEncoder.encode(domainName, "UTF-8"));

} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}




try {

HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost(urlString);
FileBody bin1 = new FileBody(file1);

ProgressMultipart reqEntity = new ProgressMultipart(new ProgressListener() {

@Override
public void transferred(long num) {
//publishProgress((int) ((num / (float) file1.length() ) * 100));

publishProgress((int) ((num / (float) totalSize ) * 100));
}
});

reqEntity.addPart("userfile", bin1);
if(getIntent().hasExtra("show_id"))
{
//String showId = getIntent().getStringExtra("show_id");
reqEntity.addPart("mobileshow", new StringBody("1"));
reqEntity.addPart("show_ids", new StringBody(getIntent().getStringExtra("show_id")));
}
reqEntity.addPart("Filename", new StringBody(file1.getName()));
reqEntity.addPart("user_id", new StringBody("2"));
reqEntity.addPart("privateasset", new StringBody("true"));
reqEntity.addPart("uploadtype", new StringBody("Normal"));
reqEntity.addPart("version_num", new StringBody("1"));

totalSize = reqEntity.getContentLength();

post.setEntity(reqEntity);

System.err.println("post :"+post.toString());

//to be check the cancel operation
if(isCancelled() && !isRunning)
{
Log.d(TAG,"Cancel 2 Condition Checked ["+i+"]");
Log.d(TAG,"File Uploading Cancelled in doInBackground method");
break;
}
else
{
Log.d(TAG,"Cancel 2 Canceled ["+i+"]");
}

HttpResponse response = client.execute(post);

resEntity = response.getEntity();
response_str = EntityUtils.toString(resEntity);
}
....
return response_str;
}

和重载的 onCancelled 方法

@Override
protected void onCancelled() {
// TODO Auto-generated method stub
Log.d(TAG,"onCancelled() method called");
super.onCancelled();

}

@Override
protected void onCancelled(String result) {
// TODO Auto-generated method stub
Log.d(TAG,"onCancelled(String) method called");

isRunning=false;


this.cancel(true);

}

我做了很多尝试和探索。即使使用取消方法,我也无法在后台停止上传过程。请任何人解决问题我提到的一些链接

http://www.technotalkative.com/cancel-asynctask-in-android/

http://developer.android.com/reference/android/os/AsyncTask.html

最佳答案

您似乎不知道 AsyncTask 是如何工作的。 onCancelled() 方法只会在doInBackground() 完成后调用,类似于onPostExecute() 方法。它不会在 uploadTask.cancel(true) 被调用后立即被调用,正如您所想的那样。您使用它的方式,您不需要 onCancelled() 方法或 isRunning 变量(当前在您的代码中 isRunning 永远不会改变为 false,因此您的 isCancelled() 检查永远不会起作用)。删除 onCancelled() 方法和 isRunning 变量,您的 AsyncTask 将起作用。

关于java - 即使使用取消方法也无法取消 AsyncTask 中的 doInBackground 进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19564339/

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