私が作成したネットワーク接続クラスに苦労しています。作成したRunnable
の結果、サーバーから必要なすべての情報を含むJSONオブジェクトが返されます。スレッドは実行され、データを完全に受信しますが、もちろん、プログラムは実行中のままです。その結果、JSONExceptionがNULLになります。クラスメソッドのコールバックの作成
Net.createNetworkThread(SignupActivity.this, requestURI, formVars);
JSONObject jsonResponse = Net.jsonResponse;
:
Iは、以下の方法を有するNetworkManager
と呼ばれるクラス(jsonResponseはクラスの開始時に初期化される)
JSONObject jsonResponse;
public void createNetworkThread(Context context, final String requestURI, final RequestBody formParameters) {
Runnable runnable = new Runnable() {
@Override
public void run() {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(requestURI).post(formParameters).build();
Response response = null;
try {
response = client.newCall(request).execute();
String stringResponse = response.body().string();
NetworkManager.this.jsonResponse = new JSONObject(stringResponse);
// This works perfectly, "message" is received and printed to the log //
Log.d("Net", NetworkManager.this.jsonResponse.getString("message"));
} catch (IOException e) {
Log.d("Net", "Failed");
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
}
};
Thread thread = new Thread(runnable);
thread.start();
}
上記のように、アクティビティから呼び出された作成しました
JSONオブジェクトjsonResponse
は、スレッドが依然として応答用のサーバーにアクセスしているため、NULLとして戻しています。
jsonResponse
オブジェクトがNULLを戻さないようにするためにスレッドが完了するまでNet.jsonResponse
によってデータが取り込まれるのを止める方法を理解する必要があります。
助けが必要ですか?
あなたはOKHttpのドキュメントを読んでください...コールバックを持つCall.executeの非同期バージョンがあります(コールバックはバックグラウンドスレッドでも呼び出されます)https://github.com/square/okhttp/wiki/Recipes #asynchronous-get – Selvin
あなたはAsyncTask、http://developer.android.com/reference/android/os/AsyncTask.htmlを使用する必要があります。一般的なスレッディングについて少しお読みください。 – anders
スレッドは非同期で実行されます。 AsyncTaskを代わりに使用する – Pooya