私はアンドロイドでasyntaskを使用してログインの詳細を取得しようとしていますが、ときどきエラーが出ます。時には時々通過することもありません。それは私のポスト実行で私のJsonobjectに私を指示続けます。なぜか分からない。Android Okhttp asynctask post excute error?
これは私のJavaクラスです。
AsyncTask<Void, Void, String> asyncTask = new AsyncTask<Void, Void, String>() {
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(Maint.this);
pDialog.setMessage("getting detail...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
pDialog.show();
}
@Override
protected String doInBackground(Void... params) {
try {
RequestBody formBody = new FormBody.Builder()
.add("email", acct.getEmail())
.add("google_id", regId)
.build();
final Request request = new Request.Builder()
.url(log)
.post(formBody)
.build();
Response response;
response = client.newCall(request).execute();
return response.body().string();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
if (pDialog != null) {
pDialog.dismiss();
}
String jsonData = s;
try {
JSONObject Jobject = new JSONObject(jsonData);
String pic = "";
if (acct.getPhotoUrl() == null || acct.getPhotoUrl().toString().isEmpty() || acct.getPhotoUrl().toString().contentEquals("")) {
pic = "https://lh3.googleusercontent.com/-5O1D0RBwhGE/AAAAAAAAAAI/AAAAAAAAAUg/Lm43fa7Sbgg/s36-p-k-rw-no/photo.jpg";
} else {
pic = acct.getPhotoUrl().toString();
}
SharedPreferences sp = PreferenceManager
.getDefaultSharedPreferences(Maint.this);
SharedPreferences.Editor edit = sp.edit();
edit.putString("firstname", acct.getGivenName());
edit.putString("lastname", acct.getFamilyName());
edit.putString("email", acct.getEmail());
edit.putString("url", pic);
edit.putString("google_id",regId);
edit.putString("check",Jobject.getString("success"));
edit.commit();
Intent uo = new Intent(getApplicationContext(), LoginActivity.class);
finish();
startActivity(uo);
} catch (JSONException e) {
e.printStackTrace();
}
}
};
asyncTask.execute();
これは、あなたがOKHTTPで非同期を行いたい場合は、独自の非同期メソッドに
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
}
});
}
@Override
public void onResponse(Call call, Response response) throws IOException {
final String res = response.body().string().trim();
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
}
});
}
});
NOTEそれを使用する必要があります実際に私のエラー
java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference
at org.json.JSONTokener.nextCleanInternal(JSONTokener.java:116)
at org.json.JSONTokener.nextValue(JSONTokener.java:94)
at org.json.JSONObject.<init>(JSONObject.java:156)
at org.json.JSONObject.<init>(JSONObject.java:173)
at com.obi.thinker.fringes.Maint$2.onPostExecute(Maint.java:223)
at com.obi.thinker.fringes.Maint$2.onPostExecute(Maint.java:182)
at android.os.AsyncTask.finish(AsyncTask.java:651)
at android.os.AsyncTask.-wrap1(AsyncTask.java)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:207)
at android.app.ActivityThread.main(ActivityThread.java:5683)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)
正常に動作しますが、s値が空の場合もありますので、リターンのためにログインしません。どのように私はこれを修正する – arinze
場合によっては、OKHTTP要求がタイムアウトまたは他の関連ネットワークの問題であったため、戻り値は実際にプログラムのクラッシュを防止しようとしています。私があなたのために提供する非同期メソッドを使用しようとすると、onFailureコールバックにネットワークエラーがあるかどうかチェックできます。エラーがある場合は、ユーザーに通知するための適切なUIが表示されているかどうかを確認してください。あなたのOKHTTP要求がサーバーに到達し、サーバーが応答を返送する場合、応答テキストには常に値が含まれていなければなりません。値が返されない場合は、ネットワーク接続に何か問題があります。 –