0
我想在android中使用asyntask登錄詳細信息,但偶爾會發生錯誤。有時它通過,有時它並不。它在我的post執行過程中一直指引着我的Jsonobject。我不知道爲什麼。Android Okhttp asynctask後期執行錯誤?
這是我的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();
這是我的錯誤
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回調中是否有任何網絡錯誤。如果有任何錯誤顯示正確的用戶界面來通知您的用戶,請讓他們再試一次。如果您的OKHTTP請求到達服務器並且服務器發回響應,則響應文本應始終包含一個值,如果沒有值返回,表示網絡連接出現問題。 –