2017-01-01 2 views
0

У меня есть класс AsyncTask внутри другого класса в отдельном файле с MainActivityNullPointerExeception для ProgressDialog в AsyncTask

GetWarehouseSales.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); 
     } 
    } 


} 

MainActivity.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.java в MainActivity.java но получаю ошибки NPE.

+0

Я не могу сказать, в чем проблема с этим кодом, но я думаю, что вы должны начать свою деятельность. В противном случае у него не будет контекста. Было бы полезно использовать трассировку стека или код функционального примера. – Distjubo

ответ

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(); 
    } 

или ..try использованием

pDialog = new ProgressDialog(getApplicationContext()); 
+0

Теперь ошибка указывает на pDialog.show(). Сообщение об ошибке «MainActivity имеет просочившееся окно DecorView @ 17887f5 [], которое изначально было добавлено здесь» – kylas

+0

@kylas попробуйте отредактировать .... – rafsanahmad007

+0

Исключенное окно исключение вызвано из-за того, что ваше mainactivity будет уничтожено, показывая progressdialog – rafsanahmad007

0

Это является причиной ошибки:

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

Вы создаете экземпляр деятельности, и когда AsyncTask выполняется, попытайтесь получить доступ к Context.

кажется Простейшая исправить это место RetrieveWarehouseSalesTask в MainActivity, что-то вроде:

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

     new RetrieveWarehouseSalesTask().execute(); 
    } 

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

надеюсь, что это поможет вам ..

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

} 

извлечь контекст:

private Context activityContext; 

public GetWarehouseSales(Context 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(); 
    } 
Смежные вопросы