1

「doInBackground」でcatchを試してみましたが、アプリが「doInBackground」でcatchメソッドを実行する場合、コードをonPostExecuteで実行したくありません。以下のコード:

public class DownloadFileAsync extends AsyncTask<String, Integer, Void> {
        @Override
        protected void onPreExecute(){
             super.onPreExecute();
     }

    @Override
    protected Void doInBackground(String... aurl) {
        try{
           //some code, jump to onPostexecute after complete
        }
        catch{
            //some code, don't do onPostExecute after complete
        }
        return null;

        }

    @Override
    protected void onProgressUpdate(Integer... progress) {          
    //some code
    }

    @Override
    protected void onPostExecute(Void unused) {
    //some code
    }
}
4

4 に答える 4

6

cancel(true)で使用してみてくださいdoInBackground()。次のコードを試してください。

protected Void doInBackground(String... aurl) {
    try{
       //some code, jump to onPostexecute after complete
    }
    catch{
        cancel(true);
    }
    return null;

    }

の公式ノートcancel()

このメソッドを呼び出すと、doInBackground(Object [])が戻った後、UIスレッドでonCancelled(Object)が呼び出されます。このメソッドを呼び出すと、onPostExecute(Object)が呼び出されないことが保証されます。このメソッドを呼び出した後、doInBackground(Object [])からisCancelled()によって返される値を定期的にチェックして、タスクをできるだけ早く終了する必要があります。

詳細については、次のリンクを確認してください。

http://developer.android.com/reference/android/os/AsyncTask.html#cancel(boolean

于 2012-07-04T07:08:28.827 に答える
3

AsyncTaskのtoからブールデータ型を返します。そして、成功のために何をしたいのか、その値を確認してください。doInBackground()onPostExecute()

@Override
    protected boolean doInBackground(String... aurl) {
        try{
           //some code, jump to onPostexecute after complete

         return true;
        }
        catch{
            //some code, don't do onPostExecute after complete

        return false;
        }   
      }

@Override
    protected void onPostExecute(boolean flag) {
    if(flag)
     {
      //some code
     }
    }
于 2012-07-04T07:00:03.887 に答える
1

にブール変数を含めてAsyncTask、その変数を確認できます。例えば:

public class DownloadFileAsync extends AsyncTask<String, Integer, Void> {

 private boolean run_do_in_background = true;

    @Override
    protected void onPreExecute(){
         super.onPreExecute();
 }

@Override
protected Void doInBackground(String... aurl) {
    try{
       //some code, jump to onPostexecute after complete
    }
    catch{
        //some code, don't do onPostExecute after complete
        run_do_in_background = false;
    }
    return null;

    }

@Override
protected void onProgressUpdate(Integer... progress) {     

//some code
}

@Override
protected void onPostExecute(Void unused) {
 if(run_do_in_background) { //only if this is true will excecute the code in doInBackground
//some code
}
}
}
于 2012-07-04T07:01:02.427 に答える
1

ペアを使用して、2つの結果を返すことができます

たとえば、ANYTHINGを返したいタイプに置き換えます。

public class DownloadFileAsync extends AsyncTask<String, Integer, Pair<Exception, ANYTHING> > {    
    @Override
    protected Pair<Exception, ANYTHING> doInBackground(String... aurl) {
        try{
           return new Pair<Exception, ANYTHING>(null, /* anything can go here */);

        }
        catch (Exception e) {
             return new Pair<Exception, ANYTHING>(e, null);
        }    
    }

    @Override
    protected void onPostExecute(Pair<Exception, ANYTHING> result) {
        // Evaluate the exception here
        if(result.first != null) {
            // an eror occured, do something about it
        }
    }
}

このようにして、onPostExecuteで例外を処理し、すべてがうまくいった場合はresult.secondから結果を取得できます。

于 2012-07-04T07:07:31.477 に答える