2013-03-31 61 views
0

据我了解,一旦AsyncTask被调用,结果将被改为null,并且AsyncTask被取消。有没有办法保留结果并将其传递给onPostExecute(String result)developer.android.com表示不要明确地调用这些函数。在取消AsyncTask时执行onPostExecute

的应用基本上扫描图像,而如果用户取消异步任务,我想异步任务,以显示已扫描图像。所以结果不应该设置为null。

这可能实现吗?如果是,如何?

class openCVOperation extends AsyncTask<String, String, String>{ 
    private MainActivity context = null; 
    /*lots of variables here*/ 
    public openCVOperation(MainActivity context1) { 
     context = context1;// set context from mainActivity 
             // which 
             // inherits Activity super class. 
             // Needed 
             // for accessing widgets. 
    } 

    @Override 
    protected void onPreExecute() { 
     pd = new ProgressDialog(context); 
     pd.setIndeterminate(false); 
     pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
     pd.setMax(100); 
     pd.setCancelable(true); 
     pd.setCanceledOnTouchOutside(false); 
     pd.setMessage("Starting up"); 
     pd.show(); 
    } 
    @Override 
    protected String doInBackground(String... params) { 
     publishProgress("Finding path to Storage..."); 
     path = Environment.getExternalStorageDirectory(); 
     p = path.getAbsolutePath(); 
     p=p+"/location"; 
     rm(p);// this has a loop! 
     return null; 

    } 
    @Override 
    protected void onCancelled() 
    { 
     System.out.println("In onCancelled"); 
     super.onCancelled(); 
    } 
@Override 
    protected void onPostExecute(String result) { 
     pd.dismiss(); 
     /*post execute stuff* 
    } 

rm(p)有一个循环,所以我尝试使用isCancelled()作为条件,但没有奏效。

+0

你可以发布你的代码吗?你在哪里取消你的asynctask? – Raghunandan

+0

我取消了UI中的asynctask。我已经覆盖了后退按钮,但它似乎并没有工作。 –

回答

1

我只是把它添加到我的doInBackground()

pd.setOnCancelListener(new DialogInterface.OnCancelListener() { 

      @Override 
      public void onCancel(DialogInterface dialog) { 
       // TODO Auto-generated method stub 
       task.cancel(true); 
      } 
     }); 

哪里pd是我的进度对话框。

另外,还要确保你在doInBackground()onCancelled()将永远不会被调用检查isCancelled()和应用程序将强制关闭。

1

在doInBackground

if (isCancelled()) 
{ 
    return // image so far 
} 


onPostExecute(String result) 
{ 

    // show result 
} 
+0

这是一个String类型的函数。所以我必须返回一个字符串值。我必须返回什么?我在'onPostExecute(String result)'中需要很多变量。 –

+0

如果返回字符串,如何获取扫描图像? –

+0

'AsyncTask'被取消时'onPostExecute()'不会被调用。 – 323go

-1

如果onCancelled不会被调用,然后你rm方法仍在运行。 因为如你所说,它运行一个循环。

控制过程(知道是否需要停止),最好的办法是通过轮询或乏味检查你的rm方法中的volatile boolean变量的状态。

例如,在称为cancel的AsyncTask类中创建一个static volatile boolean变量。在onPreExecute方法中将此变量设置为false

在您的rm方法中,检查cancel在繁重的任务(打开文件,读取文件,下载循环的一部分)前后是否为真。

如果这是真的,那么打破了return声明的方法。 更好的是,使您的rm方法返回一个整数,0代表良好,1代表取消。

最后,doInBackground方法命中返回的权利之前,看看你是否需要调用线程或不取消。

public class asyncTask extends AsyncTask<Void, Void, Void> 
{ 
    private static synchronized boolean cancel; 

    protected void onPreExecute() 
    { 
     cancel = false; 
    } 

    protected String doInBackground(Void ... params) 
    { 

     rm(p); 

     if(cancel) 
      asyncTask.cancel; 
     else 
      return null; 
    } 

    protected void onCancelled() 
    { 
     // only executed if doInBackground resulted in a cancel == true 
    } 

    protected void onPostExecute(Void param) 
    { 
     /// only executed if doInBackground resulted in a cancel == false 
    } 

    private int rm(String str) 
    { 
     if(cancel) 
      return 1; 

     //do part of task 

     if(cancel) 
      return 1; 

     //another part of task 

     if(cancel) 
      return 1; 

     //another part of task 

     return cancel ? 1 : 0; 
    } 

} 
0

收集结果:

public class MyTask extends AsyncTask<Void,Void,Void>{ 
    private final List<String> data; 

    public MyTask(){ 
    data = new ArrayList<String>(); 
    } 

    public synchronized List<String> getData(){ 
    return new ArrayList<String>(data); //--current data snapshot-- 
    } 

    private synchronized collect(String s){ 
    data.add(s); 
    }  

    @Override 
    public Void doInBackground(Void...args){ 
    //---do stuff-- 
    collect(/*-stuff-*/); 
    } 
} 

您不会丢失,即使线程被中断任何东西。

相关问题