0

我有一个问题AsyncTask

我通过调用 webService 来更新对象列表。在此期间,我想显示一个ProgressDialog. 然后,当列表完全更新时,我也希望关闭对话框和 AsyncTask。

问题是 UIThread 不等待AsyncTask完成。我看到该get()方法可以为我工作,但是有了它, UIThread 只是被阻止了,并且对话框没有显示。

我想知道如何在显示 ProgressDialog 时设法等待任务完成。

这是我的 AsyncTask 类:

public class MyAsyncTask extends AsyncTask<Integer, Void, Boolean>{

private ProgressDialog  pd;

private String          m_sShelfCode;
private String          m_sFamiliyCode;

public MyAsyncTask(String shelfCode, String familyCode) {
    this.m_sShelfCode = shelfCode;
    this.m_sFamiliyCode = familyCode;
}

@Override
protected void onPreExecute() {
    AppManager app = AppManager.getInstance();
    LayoutInflater inflater = (LayoutInflater)app.m_AppContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    RelativeLayout rl = (RelativeLayout)inflater.inflate(R.layout.progress_dialog, null,  false);
    pd = new ProgressDialog(app.m_AppContext);
    pd.requestWindowFeature(Window.FEATURE_NO_TITLE);
    pd.setCancelable(false);
    pd.show();
    pd.setContentView(rl);
}

@Override
protected Boolean doInBackground(Integer... params) {
    Log.d("DO IN BACKGROUND","param[0]="+params[0]);
    switch (params[0]) {
    case AppManager.SHELF_LIST:
        //Calling WebService
        SoapShelf s = new SoapShelf();
        try {
            ArticleListFragment.m_ShelfList = s.getShelfList();
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        } catch (XmlPullParserException e) {
            e.printStackTrace();
            return false;
        }
        break;
    case AppManager.FAMILY_LIST:
        // set family list
        break;
    case AppManager.ARTICLE_LIST:
        // set article list
        break;
    }
    return true;
}

@Override
protected void onPostExecute(Boolean result) {
    pd.dismiss();
    if (result == false)
        ;// error dialog
}
}

我在这里在我的 ArticleListFragment 中调用它

public void getItemList(int listType) {
    switch (listType) {
    case AppManager.SHELF_LIST:
            new MyAsyncTask(null, null).execute(new Integer[]{AppManager.SHELF_LIST});

提前致谢

4

1 回答 1

1

尝试:

@Override
protected void onPreExecute() {
    pd = ProgressDialog.show(context, "title", "message");
}

@Override
protected void onPostExecute(Boolean result) {
  if (pd != null && pd.isShowing())
    pd.dismiss();
}
于 2013-09-03T13:49:48.787 回答