2017-07-12 7 views
-1

私はJSONobject var(Acumulatorという名前)を持っています。ここにいくつかのJsonノードが蓄積されています。時間が経過すると、私はこのJSONObject Accumulatorの内容をhttpで送る必要があります。このため私はAsyncTaskを使う必要があります。私はそれをうまくやる分からないがAsyncTaskを正しく使用するには?

private class doSynchLocationsTask extends AsyncTask<JSONObject, Void, Boolean> { 

    @Override 
    protected Boolean doInBackground(JSONObject... params) { 
     //do the job 
     if (OK) return true 
     else return false; 
    } 

    @Override 
    protected void onPostExecute(Boolean result) { 
     if (!result) { 
     // here my problem how to access the JSONObject to put it back 
     // in the original Acumulator to process it again later ? 
     }  
    } 

} 

JSONObject tmpAccumulator = mAccumulator; 
mAccumulator = new JSONObject(); 
new doSynchLocationsTask().execute(tmpAccumulator); 

私はこのようにそれを行います。まずこのコードにメモリリークがないかどうか、mAccumulatorを使ってtmpAccumulatorのスワップを行うときに、私はonPostExecuteでJSONObject(つまり:tmpAccumulator)にアクセスする方法を知らないシステムに再度処理させるmAccumulator

+1

は、あなただけのJSONObjectへの参照を握っメンバ変数を作成できませんでしたが、あなただけonPostExecuteから参照できることをdoInBackgroundに渡されますか? –

+0

doInBackgroundの両方でHTTPと "JSONの蓄積"を行うことができます。あるいは、あなたはこの仕事にもっと適したライブラリのように思えるRxJavaを学び/使用することができます。 –

+0

@MichaelKrause hmmmmmmmはい私はこれをこのようにするとは思わなかった!とてもシンプルに見えませんでした... – loki

答えて

1

ごAsyncTaskのコンストラクタを作成する必要はありません。

ちょうどこのような何かを試してみてください。

private class doSynchLocationsTask extends AsyncTask<JSONObject, Void, Boolean> { 
    private JSONObject mJsonObject; 

    @Override 
    protected Boolean doInBackground(JSONObject... params) { 
     mJsonObject = params[0]; 
     //do the job 
     if (OK) return true 
     else return false; 
    } 

    @Override 
    protected void onPostExecute(Boolean result) { 
     if (!result) { 
     // here my problem how to access the JSONObject to put it back 
     // in the original Acumulator to process it again later ? 

     // Reference mJsonObject here 
     }  
    } 
} 
+0

'doInBackground'が異なるパラメータを受け入れると仮定すると、コンストラクタが必要になります –

+0

確かに、必要でない限り本当に必要なわけではありません。この場合、必要以上にコードを書くのはなぜですか? –

+0

ソリューションが簡単だったので感謝しています! – loki

1

カスタムAsyncTaskクラスのコンストラクタを作成します。 AsyncTaskクラスの新しいオブジェクトを作成するときに、変数をパラメータとして送信します。このような

private class CustomAsyncTask extends AsyncTask<Void, Void, Boolean> { 

    private String myString; 

    public CustomAsyncTask(String myString) { 
     this.myString = myString; 
    } 

    @Override 
    protected Boolean doInBackground(Void... voids) { 
     //use myString whereever you want in Custom AsyncTask class 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Boolean aBoolean) { 
     //use myString whereever you want in Custom AsyncTask class 
    } 
} 

呼び出し、それを:

String myString = "test"; 

    new CustomAsyncTask(myString).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
+0

いいえ、メソッドを実行するためのデータを送信しますが、コンストラクタに送信しますが、Michael Krauseの答えも答えです。 –

+0

ありがとう!それはこのような仕事です:) – loki

関連する問題