Android,synctask在progressDialog之后不显示列表

Android,synctask在progressDialog之后不显示列表,android,Android,我使用AsyncTask在列表上显示数据,但加载是可见的,但它不显示列表 public void getLocations(){ Connect client = new Connect(SERVICE_URI + "/GetLocations"); client.AddHeader("Accept", "application/json"); client.AddHeader("Content-Type", "application/json"); try

我使用AsyncTask在列表上显示数据,但加载是可见的,但它不显示列表

  public void getLocations(){
    Connect client = new Connect(SERVICE_URI + "/GetLocations");
    client.AddHeader("Accept", "application/json");
    client.AddHeader("Content-Type", "application/json");

    try {
        client.Execute(RequestMethod.GET);
        JSONObject rootJson = new JSONObject(client.getResponse());
        JSONArray jsonArray = rootJson.getJSONArray("GetLocationsResult");

        String[] names = null;
        if (jsonArray != null) {
            names = new String[jsonArray.length()];
            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject json = jsonArray.getJSONObject(i);
                names[i] = json.getString("Name");
            }
        }

        setListAdapter(new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, names));
    } catch (JSONException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
}


  public void getLocations(){
 Connect client = new Connect(SERVICE_URI + "/GetLocations");
    client.AddHeader("Accept", "application/json");
    client.AddHeader("Content-Type", "application/json");

    try {
     client.Execute(RequestMethod.GET);
     JSONObject rootJson = new JSONObject(client.getResponse());
     JSONArray jsonArray = rootJson.getJSONArray("GetLocationsResult");

     String[] names = null;
     if (jsonArray != null) {
         names = new String[jsonArray.length()];
         for (int i = 0; i < jsonArray.length(); i++) {
             JSONObject json = jsonArray.getJSONObject(i);
             names[i] = json.getString("Name");
         }
     }

        setListAdapter(new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, names));
    } catch (JSONException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

若ListAdapter的数据是在AsyncTask的doInBackground中收集的,则Activity onCreate不会等待AsyncTask完成

因此,我们有: 1.活动开始 2.异步任务启动 3.试图设置ListAdapter的活动-它为空,因为AsyncTask未完成 4.AsyncTask已完成-但ListAdapter中填充了空数据

我的解决方案:AsyncTask应在数据加载完成后通知ListAdapter活动:

Public class MyActivity extends Activity{

@Override
protected void onCreate(Bundle savedInstanceState) {


    super.onCreate(savedInstanceState);
    setContentView(R.layout.myActivity);
    ExpandableListView listView = (ExpandableListView) findViewById(R.id.expList);

    //MyArrayList - data source for your list. For example, I use static ArrayList from other class. Replace with your data object.

    final MyExpandableListAdapter adapter = new MyrExpandableListAdapter(getApplicationContext(), myArrayList);

    listView.setAdapter(adapter);

    int taskId=1; // type of task should be executed
    MyAsyncTask myTask = new MyAsyncTask(taskId); 
    myTask.execute(adapter);





@Override
protected Dialog onCreateDialog(int id) {

    ProgressDialog progress = null;
    progress = new ProgressDialog(this);
//用户是否应该在加载数据时使用应用程序?在我的例子中,否,因此setCancelable=false progress.setCancelablefalse

    if (id==1) {
        progress.setMessage("Getting locations, please wait...");
    }

    if (id==2) {
        progress.setMessage("Task type #2 performing...");
    }

    return progress;

} // end onCreateDialog



class MyAsyncTask extends AsyncTask<Void, Void, Void> {


    MyExpandableListAdapter adapter; //ExpandableListAdapter you wanna notify about data load completion

    int taskId; //Type of tasks in your Activity. You have only one, however - getLocations().


    MyAsyncTask(int taskId) {

        //save task ID to use in doInBackground, showDialog and dismissDialog
        this.taskId=taskId;

    }


    @Override
    protected Void doInBackground(Void... params) {


            if (taskId==1) {

                // YOUR LONG-TIME TASK #1 THAT UPDATES DATA SOURCE FOR LIST ADAPTER  GOES HERE;

            }


            if (taskId==2) {
                // YOUR LONG-TIME TASK #2 THAT UPDATES DATA SOURCE FOR LIST ADAPTER  GOES HERE;
                // create more task types if needed


            }


            //this adapter will be used in onPostExecute() to notify Activity about data changes
            adapter = (MyExpandableListAdapter) params[0];




        return null;

    }

    @Override
    protected void onPreExecute() {

        //Show dialog for this task type. if need more than one - us switch here and in onCreateDialog, 
        // different dialog types for different tasks etc.

        showDialog(taskId);

    }

    @Override
    protected void onPostExecute(Void result) {

        // IMPORTANT! Update data in Activity
        adapter.notifyDataSetChanged();

        dismissDialog(taskId);

    }


} //end of AsyncTask

}//活动类结束

很明显的答案是,您要么抛出异常,要么抛出jsonArray.length为0