Обработка результатов AsyncTask

Я должен использовать AsyncTask для заполнения списка с результатом. Вот мой код:

public class MyActivity extends Activity {
 MainActivity ob;
 String url_connectX = "http://hosr.com/test/getjson.php";
 Httppostaux post;
 JSONArray lststat;

 public JSONArray liststatus() {
 JSONArray jdata=post.getserverdataX(url_connectX);
 return jdata;
 } 

 @Override
 protected void onCreate(Bundle icicle) {
 super.onCreate(icicle);
 setContentView(R.layout.my_new_screen);
 post = new Httppostaux();
 new asyncpost().execute();
 }

//************************************************************************************
 class asyncpost extends AsyncTask< String, String, String > {
 List<string> listContents; 

 protected void onPostExecute(String result) {
 pDialog.dismiss();
 if (result.equals("ok")){
 ListView myListView = (ListView) findViewById(R.id.ListView1);
 Log.e("JSON log", "This is my problem = "+listContents); 
 myListView.setAdapter(new ArrayAdapter<string>(MyActivity.this, android.R.layout.simple_list_item_1, listContents));
 }else{
 Log.e("JSON log", "ListContents has problems."+listContents); 
 err_getlista();
 }
 }
 protected String doInBackground(String... params) {
 lststat = liststatus();
 if (lststat != null){ 
 if (lststat != null && lststat.length() > 0){
 JSONObject json_data; 
 try {
 int length = lststat.length();
 List<string> listContents = new ArrayList<string>(length);
 for (int i = 0; i < length; i++)
 {
 json_data = lststat.getJSONObject(i);
 listContents.add(json_data.getString("client_name"));
 }
 } catch (Exception e) {
 Log.e(null, e.toString());
 } 
 } 
 return "ok"; 
 }else{ 
 return "err"; 
 }
 }
 public void err_getlista(){
 Toast toast1 = Toast.makeText(getApplicationContext(),"Error", Toast.LENGTH_SHORT);
 toast1.show(); 
 } 
 }
//************************************************************************************
 }
</string></string></string></string>

listContents заканчивается NULL. Зачем? Кажется, что где-то в postExecute значение listContent становится NULL, даже если в doInBackGround, похоже, значение не равно NULL. Я не понимаю, как это можно исправить?

1 ответ

Вы redeclare listContents в doInBackground. Это локальная переменная, которая имеет приоритет над членом класса. Кроме того, вы, вероятно, захотите убедиться, что у вас есть некоторые ограничения, проверяющие размер списка в нулевом размере

// should be ...
 // listContents = new ArrayList<string>(length);
 List<string> listContents = new ArrayList<string>(length);
 for (int i = 0; i < length; i++)
 {
 json_data = lststat.getJSONObject(i);
 listContents.add(json_data.getString("client_name"));
 }
</string></string></string>

licensed under cc by-sa 3.0 with attribution.