2017-05-21 9 views
0

私はアンドロイドで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) 

答えて

0

です:あなたはを更新するために弱々しい場合あなたがrunOnUIThreadを使用する必要があるUIそれ以外の場合、あなたのアプリをクラッシュさせます。 OKHTTPと同期させたい場合は、asynctaskを使用する必要はありません。違いについてもっと知りたい場合は、difference between async and syncをチェックしてください。

あなたのログキャットに基づいて、行116または94でクラッシュします。問題はOKHTTPで発生していません。メソッドlength()でnullオブジェクトにアクセスしようとしました。最高pratice:たとえば

String text = null; 
if(text.length > 0){ //the app will throw a NPE(Null Pointer Exception) error. 
    Log.d("TAG","ok"); 
} 

のためには、クラッシュが発生しませんonPostExecute() method

@Override 
      protected void onPostExecute(String s) { 
       super.onPostExecute(s); 
       if (pDialog != null) { 
        pDialog.dismiss(); 
       } 

       if(s == null){ 
        Log.d("TAG","reponse return null");      
        return; 
       } 

       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(); 
       } 
      } 

にあなたのケースのためにチェック

if(text != null){ 
    if(text.length > 0){ 
    } 
} 

を行うことができます。

+0

正常に動作しますが、s値が空の場合もありますので、リターンのためにログインしません。どのように私はこれを修正する – arinze

+0

場合によっては、OKHTTP要求がタイムアウトまたは他の関連ネットワークの問題であったため、戻り値は実際にプログラムのクラッシュを防止しようとしています。私があなたのために提供する非同期メソッドを使用しようとすると、onFailureコールバックにネットワークエラーがあるかどうかチェックできます。エラーがある場合は、ユーザーに通知するための適切なUIが表示されているかどうかを確認してください。あなたのOKHTTP要求がサーバーに到達し、サーバーが応答を返送する場合、応答テキストには常に値が含まれていなければなりません。値が返されない場合は、ネットワーク接続に何か問題があります。 –