2012-03-28 8 views
4

私はasynctaskのonPostExecuteメソッドの結果の値を以前のアクティビティ、つまりayncタスクが実行されているアクティビティに送る必要があるアプリケーションを開発していますいくつかのコードを入力します。私があなただったらAsyncTask asynctask onpostexecuteメソッドの結果を親アクティビティに渡す方法android

を拡張するクラスのPARAMとして

  • パスハンドラまたは活動自体親アクティビティにプライベートクラスとしてAsyncTaskを拡張

    1. 宣言クラス:Anyhelpは

  • 答えて

    8

    二つの方法を高く評価しています、私は最初のオプションに従います。 DOCS
    ルック:機能onPostExecuteの体内に配置された

    class MyActivitySubclass extends Activity { 
    
        function runOnPostExecute(){ 
         // whatever 
        } 
    
        private class MyTask extends AsyncTask<Void, Void, Void> { 
    
         void doInBackground(Void... params){ 
          // do your background stuff 
         } 
    
         void onPostExecute(Void... result){ 
          runOnPostExecute(); 
         } 
    
        } 
    
    } 
    

    注1

    コードは、すでに活動スレッドで実行され、あなたはthisキーワードはMyTask.thisにつながることだけ言及する必要がありますそうでない場合MyActivitySubclass.this

    1

    メインのUIスレッドでonPostExecuteメソッドが起動されるため、そこで行われた処理はすべてAsyncTasks呼び出し元に既に存在します。まあ

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

    +1

    OPの問題は明らかに別ファイルでパブリッククラスとして宣言されたAsyncTaskサブクラスです。彼はすでに 'onPostExecute'が何のために使われているかを知っています –

    2

    あなたのAsyncTaskは内部クラスであれば、あなたは単にonPostExecute()から、あなたの活動のメソッドを呼び出すことができます。

    public class MyActivity extends Activity { 
    
        public void someMethod(String someParam) { 
         // do something with string here 
        } 
    
        public class InnerTask extends AsyncTask<...> { 
    
         protected void onPostExecute(result) { 
          someMethod(Send parameters); 
         } 
    
        } 
    
    } 
    
    1

    火OnPostExecuteでイベントを。

    0

    これは、Marek Seberaの回答に追加され、ハンドラを使用するように指摘されています。コードをシンプルで直観的に保つには、インターフェイスを使用します。これはエイリアンの概念ではなく、コールバック関数(OnClickListnerなど)のために常に使用します。コードはこのようなものに見えます。

    public class InnerTask extends AsyncTask<...> 
        { 
         interface ResultHandler 
         { 
          void gotResult(<> result); 
         } 
    
         private ResultHandler myResult; 
    
         //constructor 
         public InnerTask(....params...,ResultHandler callback) 
         { 
          ... 
          this.myResult = callback; 
         } 
    
         protected void onPostExecute(<>result) 
         { 
          ... 
          myResult.gotResult(result); 
         } 
    
        } 
    
        public class MyActivity extends Activity implements InnerTask.ResultHandler 
        { 
         @Override 
         protected void onCreate(Bundle savedInstanceState) 
         { 
          //do something 
          //if you want the InnerTask to execute here 
          InnerTask i = new InnerTask(....params...,this); //send 'this' as parameter 
          i.execute(); 
         } 
         @Override 
         public void gotResult(<> result) 
         { 
          //from onPostExecute 
         } 
        } 
    

    我々は複数のサイトで同じAsynTaskクラスを使用したい場合は、我々はこのタイプの実装を使用する代わりに、ネストされたクラスの実装を使用することができます。

    関連する問題