2017-01-01 3 views
0

Ich habe eine AsyncTask Klasse innerhalb einer anderen Klasse in einer separaten Datei von MainActivityNullPointerExeception für ProgressDialog in 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(); 

    } 

Der Fehler :

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

Der Fehlerpunkt auf dieser Linie:

pDialog = new ProgressDialog(GetWarehouseSales.this); 

Ich möchte die AsyncTask RetrieveWarehouseSalesTask auszuführen, die in GetWarehouseSales.java in MainActivity.java gefunden werden kann, aber NPE Fehler bekommen.

+0

Ich kann nicht wirklich sagen, was das Problem mit diesem Code ist, aber ich denke, dass Sie die Aktivität tatsächlich starten müssen. Sonst wird es keinen Kontext haben. Ein Stack-Trace oder ein Funktionsbeispielcode wäre hilfreich. – Distjubo

Antwort

4

versuchen, den MainActivity Kontext vorbei ..

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

} 

den Kontext Retreive:

private Activity activityContext; 


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

Jetzt initialisieren Ihre ProgressDialog mit diesen Kontext

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

oder ..try mit

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

Jetzt zeigt der Fehler auf pDialog.show(). Die Fehlermeldung ist "MainActivity hat Fenster DecorView @ 17887f5 [geleckt, das ursprünglich hier hinzugefügt wurde" – kylas

+0

@ kylas versuchen Sie die Bearbeitung .... – rafsanahmad007

+0

Fenster Leckage-Ausnahme wird aufgrund Ihrer Mainactivity verursacht werden zerstört, während der Fortschrittdialog angezeigt wird – rafsanahmad007

0

ist der Grund des Fehlers:

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

Sie eine Instanz von Aktivität zu erstellen, und wenn die AsyncTask ausgeführt wird, versuchen Zugriff auf die Context zu bekommen.

Sieht aus wie die einfachste Lösung ist RetrieveWarehouseSalesTask in MainActivity zu platzieren, so etwas wie:

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

     new RetrieveWarehouseSalesTask().execute(); 
    } 

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

hoffe, dies wird Ihnen helfen ..

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

} 

den Kontext Retreive:

private Context activityContext; 

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

Jetzt initialisieren Sie Ihren ProgressDialog mit diesem Kontext

Verwandte Themen