0

私が言ったように、これは AsyncTask の正しい使い方ですか?

つまり、パラメーターを使用せずに にアクティビティ コンテキストを渡し、返された値onPreExecute()の結果を取得するのではなくdoInBackground()、 が呼び出されるとマネージャー自体を取得しonPostExecute()ます。

そしてもう1つ、Asynctask APIリファレンスにonPostExecute()は、「タスクがキャンセルされた場合、このメソッドは呼び出されません」と書かれています。、メソッドの実行中に SomeException が発生した場合はどうなりますか? doInBackground()¿onPostExecuted()

public class MainClass {
    ...
    //Somewhere in the class, the task is called:
    new MyAsyncTask.execute();
    ...

    private class MyAsyncTask extends AsyncTask <Void,Void,Void> {

        private MyManager manager;

        protected void onPreExecute(){
            super.onPreExecute();
            //We initialice the members here, passing the context like this:
            manager = new Manager(MainClass.this);
            manager.initializeMembers();
        }

        protected void doInBackgroud(Void ...params){
            try{
                //here we use the long operation task that is inside the manager:
                manager.startLongTask();                
            } catch (SomeException e){
                doWhatEverItIsWith(e);
            }
            return null;
        }

        protected void onPostExecute (Void result){
            super.onPostExecute(result);
            //Here we get the result from the manager
            handleTheResultFromHere(manager.getResult());
        }
    }
}

ありがとうございました。

4

2 に答える 2

1

このようにAsyncTaskを使用しても問題はありません。doInBackground戻り値を使用する必要はありません。2番目の質問についてonPostExecuteは、例外の場合でも「はい」と呼ばれます。あなたがそれを呼びたくないならば、あなたはそれを使わなければならないでしょうMyAsyncTask.cancel(true)

于 2012-10-05T11:46:49.473 に答える
1

私が言ったように、これはAsyncTaskの正しい使用法ですか?

はい、アクティビティコンテキストを渡してからonPreExecute()、データを読み込んでdoInBackgroud()UIを更新しても問題ありませんonPostExecute()

では、doInBackground()メソッドの実行中にSomeExceptionが発生した場合、¿onPostExecuted()が呼び出されますか?

はい、でonPreExecute()例外が発生した場合に呼び出されますdoInBackgroud()。ロードするデータをチェックしてonPreExecute()、データがnullでないかどうかを確認し、UIを更新する必要があります。

NOTE:

doInBackgroud()UI以外のスレッドからUIを更新することはできないため、UIを更新しようとしないでください。例外が発生します。別の方法は、UI以外のスレッドからUIを使用Handlerまたは更新することです。runOnUIThread()

于 2012-10-05T11:48:23.887 に答える