AsyncTask中ProgressDialog的NullPointerException [重复]

问题描述 投票:0回答:3

这个问题在这里已有答案:

我在MainActivity的一个单独文件中的另一个类中有一个AsyncTask类

get warehouse sales.Java

public class GetWarehouseSales extends Activity {

    private String TAG = MainActivity.class.getSimpleName();
    private ListView lv;
    private ProgressDialog pDialog;
    //URL to get JSON details
    private static String url = "http://192.168.0.1/mycc/retrieve_ws.php";
    ArrayList<HashMap<String,String>> sales_details;

    public GetWarehouseSales(){
    }

    public void executeGWS(){
        new RetrieveWarehouseSalesTask().execute();
    }


    public class RetrieveWarehouseSalesTask extends AsyncTask<Void,Void,Void>{

        public RetrieveWarehouseSalesTask(){

        }

        @Override
        protected void onPreExecute(){
            super.onPreExecute();
            pDialog = new ProgressDialog(GetWarehouseSales.this);
            pDialog.setMessage("Getting you the best warehouse sales...");
            pDialog.setCancelable(false);
            pDialog.show();
        }

        @Override
        protected Void doInBackground(Void... arg0){
            HttpHandler sh = new HttpHandler();
            //making a request to URL and getting response
            String jsonStr = sh.makeServiceCall(url);
            Log.e(TAG, "Response from url: " + jsonStr);

            if(jsonStr != null){
                try{
                    JSONObject jsonObj = new JSONObject(jsonStr);
                    //Getting JSON Array Node
                    JSONArray sales = jsonObj.getJSONArray("Result");
                    //looping through all results
                    for(int i = 0; i<sales.length();i++){
                        JSONObject s = sales.getJSONObject(i);
                        String title = s.getString("title");
                        String description = s.getString("description");

                        HashMap<String,String> salesDetails = new HashMap<>();

                        //adding each child node to HashMap key =>value
                        salesDetails.put("title",title);
                        salesDetails.put("description",description);

                        //adding to array list
                        sales_details.add(salesDetails);
                    }
                    Log.d("TAG",sales_details.toString());
                }catch(final JSONException e){
                    Log.e(TAG, "JSON parsing error: " + e.getMessage());
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(getApplicationContext(),"JSON parsing error: " + e.getMessage(),Toast.LENGTH_LONG).show();
                        }
                    });
                }
            }else{
                Log.e(TAG,"Couldn't get json from server");
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(getApplicationContext(), "Check logcat", Toast.LENGTH_LONG ).show();
                    }
                });
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result){
            super.onPostExecute(result);
            if(pDialog.isShowing()){
                pDialog.dismiss();
            }

            //update parsed JSON data into ListView
            ListAdapter adapter = new SimpleAdapter(GetWarehouseSales.this, sales_details,R.layout.item_listview, new String[]{
                    "title","description"}, new int[]{R.id.text,R.id.description});

            lv.setAdapter(adapter);
        }
    }


}

main activity.Java

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        GetWarehouseSales gws = new GetWarehouseSales();
        gws.executeGWS();

    }

错误:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object reference

错误指向此行:

pDialog = new ProgressDialog(GetWarehouseSales.this);

我想执行AsyncTask RetrieveWarehouseSalesTask,它可以在GetWarehouseSales.javaMainActivity.java中找到,但是会出现NPE错误。

java android android-asynctask
3个回答
4
投票

尝试传递MainActivity上下文..

 @Override
protected void onCreate(Bundle savedInstanceState) {
    GetWarehouseSales gws = new GetWarehouseSales(MainActivity.this);
    gws.executeGWS();

}

检索上下文:

private Activity activityContext;


 public GetWarehouseSales(Activity context){
     this.activityContext=context;
}

现在使用该上下文初始化您的ProgressDialog

 @Override
    protected void onPreExecute(){
        super.onPreExecute();
        pDialog = new ProgressDialog(activityContext);
        pDialog.setMessage("Getting you the best warehouse sales...");
        pDialog.setCancelable(false);
        pDialog.show();
    }

或..使用

 pDialog = new ProgressDialog(getApplicationContext());

0
投票

这是错误的原因:

    GetWarehouseSales gws = new GetWarehouseSales();
    gws.executeGWS();

您创建了一个活动实例,当AsyncTask正在执行时,尝试访问Context

看起来最简单的解决方法是将qazxsw poi放入qazxsw poi,例如:

RetrieveWarehouseSalesTask

0
投票

希望对你有帮助..

MainActivity

检索上下文:

class MainActivity ... {
    ...
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...

        new RetrieveWarehouseSalesTask().execute();
    }

    public class RetrieveWarehouseSalesTask extends AsyncTask<Void,Void,Void>{
    ...
}

现在使用该上下文初始化ProgressDialog

@Override
protected void onCreate(Bundle savedInstanceState) {
    GetWarehouseSales gws = new GetWarehouseSales(this);
    gws.executeGWS();

}
© www.soinside.com 2019 - 2024. All rights reserved.