[英]Unable to populate ListView from AsyncTask
錯誤是System services not available to Activities before onCreate()
下面是我的AsyncTask(在單獨文件的另一個類中) 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();
}
錯誤指向此行:
ListAdapter adapter = new SimpleAdapter(GetWarehouseSales.this, sales_details,R.layout.item_listview, new String[]{
"title","description"}, new int[]{R.id.text,R.id.description});
我正在嘗試將數據填充到listview中,但無法這樣做。
嘗試更換
new GetWarehouseSales(this).executeGWS();
至
executeGWS();
通常,您以錯誤的方式進行操作。 正如我已經在AsyncTask中為ProgressDialog的NullPointerExeception回答的那樣 ,您應該在MainActivity
定義AsynkTask
。
正如Vasily Kabunov指出的那樣,不要創建該類的新實例來調用該方法。 如果不是Activity
,也不要擴展Activity
。
但是還有一個主要問題是doInBackground
應該建立一個結果,然后將其安全地傳遞給onPostExecute
,方法是寫入活動的字段( sales_details
),這使您成為非onPostExecute
安全的。
因此,請勿訪問doInBackground
sales_details
或其他活動字段,執行以下操作:
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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.