2016-01-13 119 views
0

爲了理解爲什麼我的函數onPostExecute從不調用,所以我沒有得到結果String和應用程序擊碎! 這裏是的AsyncTask的代碼:asyncTask執行期間引發異常:java.lang.NullPointerException:嘗試調用虛擬方法

public class HttpAsync extends AsyncTask<Void,Void,String> { 
private String Json; 
private int response; 
private String auth; 
private String name; 
private AsyncResponse delegate=null; 

public HttpAsync(AsyncResponse response, String Json){ 
    this.Json=Json; 
    this.delegate=response; 

} 
@Override 
protected String doInBackground(Void... params) { 
    URL url; 
    try { 
     url = new URL("http://192.168.0.141:8080/ProgettoProva/AndroidApp"); 

     HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 

     conn.setRequestMethod("POST"); 
     conn.setDoOutput(true); 
     conn.setDoInput(true); 
     conn.setRequestProperty("Content-Type", "application/json, charset=UTF-8"); 
     conn.setRequestProperty("Accept", "text/json"); 
     conn.setFixedLengthStreamingMode(Json.getBytes().length); 
     OutputStream writer = conn.getOutputStream(); 
     writer.write(Json.getBytes("UTF-8")); 
     writer.close(); 

     response=conn.getResponseCode(); 
     if(response==HttpURLConnection.HTTP_OK) { 
      auth = "authorized"; 
      BufferedReader read =new BufferedReader(new InputStreamReader (conn.getInputStream())); 
      StringBuffer buf= new StringBuffer(); 
      String line; 
      while((line=read.readLine())!=null){ 
       buf.append(line); 
      } 
      read.close(); 
      GsonBuilder builder=new GsonBuilder(); 
      builder.registerTypeAdapter(String.class,new DataDeserializer()); 
      Gson gson=builder.create(); 
      name = gson.fromJson(buf.toString(), String.class); 

     } 
     else if(response==HttpURLConnection.HTTP_UNAUTHORIZED) { 
      auth = "not authorized"; 
     } 
     else if(response==HttpURLConnection.HTTP_ACCEPTED) { 
      auth = "registrato"; 
     } 
     else if(response==HttpURLConnection.HTTP_CONFLICT){ 
      auth="gia presente"; 
     } 

     conn.disconnect(); 
    } catch (IOException e) { 
     Log.e("ERRORE", e.getMessage()); 
    } 
    Log.d("STRINGA INVIATA: ", name+"/"+auth); 
    return name+"/"+auth; 
} 

@Override 
protected void onPostExecute(String result){ 
    Log.d("ONPOSTEXECUTED:", result); 
    delegate.returnFinish(result); 

} 

這裏是的main_activity代碼的一部分,我執行的AsyncTask:

button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      email = textEmail.getText().toString(); 
      password = textPass.getText().toString(); 
      name=textName.getText().toString(); 
      if(value==1) { 
       if (email.equals("") || password.equals("")) { 
        Toast.makeText(getApplicationContext(), "campi vuoti", Toast.LENGTH_LONG).show(); 
        return; 
       } 
      }else if(value==2){ 
       if (email.equals("") || password.equals("") || name.equals("")) { 
        Toast.makeText(getApplicationContext(), "campi vuoti", Toast.LENGTH_LONG).show(); 
        return; 
       } 
      } 
      finalJson = createJfile(); 
     // Toast.makeText(getApplicationContext(), "Json:" + finalJson, Toast.LENGTH_LONG).show(); 
      connection= new HttpAsync(Log_in.this,finalJson); 
      connection.execute(); 
       get=auth.split("/"); 
       getname=get[0]; 
       auth=get[1]; 

有日誌異常:

01-13 10:57:32.829 31566-31566/com.example.stage.drawlayoutproject E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.example.stage.drawlayoutproject, PID: 31566 
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String[] java.lang.String.split(java.lang.String)' on a null object reference 
at com.example.stage.drawlayoutproject.Log_in$1.onClick(Log_in.java:87) 
at android.view.View.performClick(View.java:5254) 
at android.view.View$PerformClick.run(View.java:21174) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:145) 
at android.app.ActivityThread.main(ActivityThread.java:6862) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199) 

其實它只是在doInBackground的末尾打印日誌,並不打印onPostExecute中的日誌

+0

你的意思是你的應用程序崩潰了嗎?如果是這樣,請提供您的堆棧跟蹤。 – Knossos

+0

在ui線程上啓動'AsyncTask' –

+0

只需離開那個可憐的'HttpUrlConnection'和'AsynckTask',讓這個庫自己處理所有的事情。使用OkHttp,https://github.com/square/okhttp/wiki/Recipes(或至少提供堆棧跟蹤,以便我們可以看到什麼是錯誤的) – Than

回答

0

的問題是在這裏:

E/AndroidRuntime: FATAL EXCEPTION: main                          

Process: com.example.stage.drawlayoutproject, PID: 31566 
java.lang.NullPointerException: Attempt to invoke virtual method 
java.lang.String[] java.lang.String.split(java.lang.String)' on a null object reference 
at com.example.stage.drawlayoutproject.Log_in$1.onClick(Log_in.java:87) 
at android.view.View.performClick(View.java:5254 
at android.view.View$PerformClick.run(View.java:21174) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95)  
at android.os.Looper.loop(Looper.java:145) 
at android.app.ActivityThread.main(ActivityThread.java:6862) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)at  com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199) 

看起來像 '聯繫' 是AsyncTask一個實例。不是HttpAsync。 在這種情況下,當您聲明此字段時,應將connection的類型更改爲HttpAsync或填寫connection的通用參數。

+0

其實我認爲致命的例外是一個事實,我可以' t從AsyncTask中檢索字符串,以便split函數試圖挖掘空字符串。我仍然認爲onPostExecute沒有被調用,因爲我沒有得到我在堆棧跟蹤中放置的日誌消息。 – Gianfranco

+0

你是對的!這不叫。你需要先解決這個異常。它會在你修復它時被調用! –

相關問題