Asynctask的onPostExecute中的NullPointerException

时间:2016-02-20 04:58:08

标签: java android multithreading collections android-asynctask

我使用套接字来检索信息,并且我使用了两次asynctask(第一个异步任务工作正常,但第二个asynctask&on onPostExceute触发NullPointerException) 下面是我的asynctask代码。

     // ******THE FIRST LINE IS GIVEN AN ERROR [LINE:123]
     private class SendMessage extends AsyncTask<Void, Void, String> {
     @Override
    protected void onPreExecute() {
        progressBar.setVisibility(View.VISIBLE);
        //CargoHelper is a  class where the below two lists are present
        Cargo_Helper.list_AI = new ArrayList<Cargo_Details>();
        Cargo_Helper.list_ING = new ArrayList<Cargo_Details>();
        if(count!=1) {
            listView.setVisibility(View.INVISIBLE);
            Log.d("sri", "onPreExecute" + count);
            al.clear();
        }
        if(count == 1){
            listView.setVisibility(View.VISIBLE);
            Log.d("sri", "onPreExecute" + count);
            id = "C";
        }
    }

    @Override
    protected String doInBackground(Void... params) {

            l1:
            try {
             // this part works fine
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.print("connection closed");
            return message;
        }

    private void updateListView(String message) {

         //updates  listview this part works well

        }

    }


    @Override
    protected void onPostExecute(String message) {

        progressBar.setVisibility(View.INVISIBLE);

            cargo.setVisibility(View.VISIBLE);
            if (message != null) {

                listView.setVisibility(View.VISIBLE);

                if(count!=1) {
                    updateListView(message);
                    count = 1;

                    Log.d("sri","onPostExecute"+count);

                }
                else{
                    //Toast.makeText(getApplicationContext(),"List obtained:" + al,Toast.LENGTH_LONG).show();

                    Log.d("sri", "In onPostExecute" + message);


    //                sort_the_objects_for_LV(message);

                    if(isDes)
                        return;


                    if(message!=null || message!=" ") {

                        String[] arr = message.split(" ");
                                               if (arr[1].equals("AI4565"))

                //******* THIS LINE IS ERRORED..I HAVE INTIALIZED  THE LIST IN PREEXECUTE ITSELF [LINE :287]



    Cargo_Helper.list_AI.add(new Cargo_Details(arr[0], arr[1] 
    Long.getLong(arr[2]), arr[3], Integer.parseInt(arr[4])));

                        else if (arr[1].equals("ING1234")) {

                            Cargo_Helper.list_ING.add(new Cargo_Details(arr[0], arr[1], Long.getLong(arr[2]), arr[3], Integer.parseInt(arr[4])));

                        }

                        // to be continued for all flights
                        // to be continued for all flights
                    }

                }
            }

    }

}

货物运输舱如下

           public class Cargo_Helper {


static List<Cargo_Details> list_AI=null;

static List<Cargo_Details> list_ING=null;

public static List<Cargo_Details> get_AirIndia_Cargo(){ return list_AI;
}

public static List<Cargo_Details> get_Indigo_Cargo(){

                   return list_ING;
}


 }

堆栈跟踪在这里..

 E/AndroidRuntime: FATAL EXCEPTION: main
 java.lang.NullPointerException at airhost.project_2_phase.All_Flight_No_Obtain_Activity$SendMessage.onPostExecute(All_Flight_No_Obtain_Activity.java:287)
 at   airhost.project_2_phase.All_Flight_No_Obtain_Activity$SendMessage.onPostExecute(All_Flight_No_Obtain_Activity.java:123)
at android.os.AsyncTask.finish(AsyncTask.java:631)
at android.os.AsyncTask.access$600(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5409)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:606)
at dalvik.system.NativeStart.main(Native Method)

我知道这个问题被多次询问,大多数答案是关于初始化特定的事情,这里是关于初始化List数据类型。我甚至已经初始化它但我无法理解为什么它会抛弃我的NPE。

1 个答案:

答案 0 :(得分:0)

问题是这个模型类Cargo_Helper它有2个静态属性,你设置为null,每次访问它时都会得到null。

您可以尝试这样的事情:

public class Cargo_Helper  {

    //you cargo details
    public static class Cargo_Details {
        public Cargo_Details() {

        }
    }

    public static List<Cargo_Details> list_AI = new ArrayList<Cargo_Details>();
    public static List<Cargo_Details> list_ING = new ArrayList<Cargo_Details>();
    static {
        //some code here
    }

    private static void addAirIndiaCargo(Cargo_Details cargo) {
        list_AI.add(cargo);
    }

    private static void addAirIndigoCargo(Cargo_Details cargo) {
        list_ING.add(cargo);
    }
}

例如

Cargo_Helper.list_AI.add(new Cargo_Details());

然后你可以直接访问Cargo_Helper.list_AI,因为它是静态的。

我不知道这样的助手是否有用,但也许你可以扩展它