【问题标题】:Exception is thrown during asyncTask execution: java.lang.NullPointerException: Attempt to invoke virtual methodasyncTask 执行期间抛出异常:java.lang.NullPointerException: Attempt to invoke virtual method
【发布时间】:2016-01-13 09:59:42
【问题描述】:

我一直在到处寻找以了解为什么我的函数 onPostExecute 从未被调用,所以我没有得到我的结果字符串并且应用程序崩溃了! 这是AsyncTask的代码:

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 的代码部分:

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 中打印日志

【问题讨论】:

  • 你的意思是你的App崩溃了?如果是这样,请提供您的堆栈跟踪。
  • 在ui线程上启动AsyncTask
  • 离开那个可怜的HttpUrlConnectionAsynckTask,让图书馆自己处理一切。使用 OkHttp,github.com/square/okhttp/wiki/Recipes(或至少提供堆栈跟踪,以便我们查看问题所在)

标签: android android-asynctask


【解决方案1】:

问题出在这里:

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 填写泛型参数。

【讨论】:

  • 实际上,我认为 FATAL EXCEPTION 是因为我无法从 AsyncTask 中检索字符串,因此拆分函数试图插入一个空字符串。我仍然认为 onPostExecute 没有被调用,因为我没有收到我在堆栈跟踪中放入的日志消息。
  • 你是对的!它没有被调用。您需要先修复此异常。当你修复它时它会被调用!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-27
  • 1970-01-01
  • 2020-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多