2016-01-13 115 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

你是对的!这不叫。你需要先解决这个异常。它会在你修复它时被调用! –

相关问题