2017-01-01 1 views
0

Der Fehler System services not available to Activities before onCreate()kann nicht Listview aufzufüllen von AsyncTask

Unten ist mein AsyncTask ist (es ist in einer anderen Klasse in einer separaten Datei ist) GetWarehouseSales.java

public class GetWarehouseSales extends Activity { 

    private String TAG = GetWarehouseSales.class.getSimpleName(); 
    private ListView lv; 
    private ProgressDialog pDialog; 
    private Activity activityContext; 
    //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(Activity context){ 
     this.activityContext = context; 
     sales_details = new ArrayList<>(); 

    } 

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


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



     @Override 
     protected void onPreExecute(){ 
      super.onPreExecute(); 
      pDialog = new ProgressDialog(activityContext); 
      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 = (ListView)findViewById(R.id.list_item); 

      lv.setAdapter(adapter); 
     } 
    } 


} 

MainActivity.java

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState) ; 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     new GetWarehouseSales(this).executeGWS(); 


    } 

Der Fehler zeigt auf t seine Zeile:

ListAdapter adapter = new SimpleAdapter(GetWarehouseSales.this, sales_details,R.layout.item_listview, new String[]{ 
        "title","description"}, new int[]{R.id.text,R.id.description}); 

Ich versuche, die Daten in die Listview zu füllen, aber nicht dazu in der Lage.

+0

'doInBackground' soll ein Ergebnis, das dann sicher zum' onPostExecute' geleitet wird Aufbau, durch das Schreiben ein Feld der Aktivität ('sales_details'), haben Sie diese Entnahmesicherheit hergestellt. – weston

+1

Warum erweitert GetWarehouseSales eine Aktivität? Und die Zeile lv = (ListView) findViewById (R.id.list_item); würde wahrscheinlich auch scheitern. –

Antwort

1

Versuchen

new GetWarehouseSales(this).executeGWS(); 

zu

executeGWS(); 

Im Allgemeinen zu ersetzen, können Sie es in der falschen Art und Weise tun. Wie ich bereits hier NullPointerExeception for ProgressDialog in AsyncTask beantwortet habe, sollten Sie AsynkTask in der MainActivity definieren.

+0

Der Grund ist, dass ich in Zukunft möglicherweise mehr AsyncTask hinzufügen werde. Daher möchte ich MainActivity als minimalen Code beibehalten. Daher habe ich AsyncTask in separaten Java-Dateien erstellt. Gibt es einen alternativen Weg, dies zu lösen? – kylas

+0

Versuchen Sie 'AsyncTask' zu machen __static__:' Öffentliche statische Klasse RetrieveWarehouseSalesTask extends' und dann 'new GetWarehouseSales.RetrieveWarehouseSalesTask(). Execute();' –

0

Wie Vasily Kabunov darauf hinweist, erstellen Sie keine neue Instanz der Klasse, um die Methode aufzurufen. Erweitern Sie auch nicht Activity, wenn es kein Activity ist.

Aber auch ein wichtiges Thema ist doInBackground sollte ein Ergebnis aufbauen werden, die dann an die onPostExecute sicher geführt wird, indem auf ein Feld der Tätigkeit schriftlich (sales_details), Sie haben dieses unthread sicher gemacht.

greift also nicht sales_details oder andere Tätigkeitsfelder in doInBackground, mehr tun wie folgt aus:

public class RetrieveWarehouseSalesTask extends AsyncTask<Void,Void,ArrayList<HashMap<String,String>>>{ //return type set 

    @Override 
    protected ArrayList<HashMap<String,String>> doInBackground(Void... arg0){ 
     ArrayList<HashMap<String,String>> result = new ArrayList<>(); 
     ... 
     //adding to array list 
     result.add(salesDetails); 
     ... 
     return result; 
    } 

    @Override 
    protected void onPostExecute(ArrayList<HashMap<String,String>> result){ 
     super.onPostExecute(result); 
     if(pDialog.isShowing()){ 
      pDialog.dismiss(); 
     } 

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

     lv.setAdapter(adapter); 
    } 
} 
+0

@kylas War das eine Hilfe für Sie? – weston

Verwandte Themen