自分のサーバーからの送受信を処理するAsyncTaskクラスを作成しました。私がしようとしているのは、データを受け取ったときにイベントまたはコールバックを起動して、そのデータを使用してUIを操作できるようにすることです。AsyncTaskを使用したコールバック関数の作成
AsyncTaskクラス:
public class DataCollectClass extends AsyncTask<Object, Void, JSONObject> {
private JSONObject collected;
@Override
protected void onPreExecute() {
super.onPreExecute();
}
//@Override -Commented out because it doesn't like the override
protected void onPostExecute() {
try {
Log.d("Net", this.collected.getString("message"));
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
protected JSONObject doInBackground(Object... params) {
OkHttpClient client = new OkHttpClient();
// Get Parameters //
String requestURI = (String) params[0];
RequestBody formParameters = (RequestBody) params[1];
Request request = new Request.Builder().url(requestURI).post(formParameters).build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
// DO something on FAIL
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String jsonResponse = response.body().string();
Log.d("Net", jsonResponse);
try {
DataCollectClass.this.collected = new JSONObject(jsonResponse);
Log.d("Net", DataCollectClass.this.collected.getString("message"));
} catch (JSONException e) {
e.printStackTrace();
}
}
});
return collected;
}
}
これが働いている、それがログにJSONの期待される行を出力します。
それは次のようにActivityから呼ばれています:
new DataCollectClass().execute(requestURI, formVars);
私はすべての上に見てきた、と私は、コールバックを追加する方法(どこ)に決定的な答えを見つけるように見えることはできません。好ましくは、コールバックコード自体はDataCollectClass
でなければならないので、関連するコードはすべて同じ場所で再利用可能です。
プログラムが聴くことができるカスタムイベント発生(Javascriptライブラリに類似)を作成する方法はありますか?
私はこれで私の髪を引っ張ってきました!
UPDATE:
AsyncTaskが冗長であるので、私はそれを削除し、コードを書き直しました(場合には他の誰かがこの同じ問題を持っている):
パブリッククラスDataCollectClass { プライベートJSONObjectを収集。
public interface OnDataCollectedCallback {
void onDataCollected(JSONObject data);
}
private OnDataCollectedCallback mCallback;
public DataCollectClass(OnDataCollectedCallback callback, String requestURI, RequestBody formParameters){
mCallback = callback;
this.collect(requestURI, formParameters);
}
public JSONObject collect(String requestURI, RequestBody formParameters) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(requestURI).post(formParameters).build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
//TODO Add what happens when shit fucks up...
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String jsonResponse = response.body().string();
Log.d("Net", jsonResponse);
try {
DataCollectClass.this.collected = new JSONObject(jsonResponse);
if(mCallback != null)
mCallback.onDataCollected(DataCollectClass.this.collected);
} catch (JSONException e) {
e.printStackTrace();
}
}
});
return collected;
}
}
Activityから呼び出され
:
new DataCollectClass(new DataCollectClass.OnDataCollectedCallback() {
@Override
public void onDataCollected(JSONObject data) {
if(data != null) {
try {
// Do Something //
} catch (JSONException e) {
e.printStackTrace();
}
}
}
}, requestURI, formVars);
すべて完璧に働いて! ありがとう!
OkHttpを使用している場合、AsyncTaskは必要ありません。 [Asynchronous get in OkHttp](https://github.com/square/okhttp/wiki/Recipes#asynchronous-get) –
AsyncTasksを削除したい場合、VolleyまたはRetrofitはJSONの操作に適していますデータ。 –