2013-09-03 2 views
0

У меня проблема с AsyncTask.Wait 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}); 

Заранее спасибо

+0

Возможно, настройка представления содержимого диалогового окна перед его отображением поможет – damian

+0

Нет, это исключает. Это должно быть так. Диалог работает, я использую его в другом месте в моем приложении. – Bernie

+0

какое исключение выбрано – damian

ответ

1

попробуйте:

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

@Override 
protected void onPostExecute(Boolean result) { 
    if (pd != null && pd.isShowing()) 
    pd.dismiss(); 
} 
+0

То же, что и раньше: s. Когда я устанавливаю адаптер в этот список после вызова AsyncTask, список пуст. Когда я обновляю свой список, список заполняется. Вы думаете, что проблема может возникнуть из диалога? – Bernie

+0

вы должны вызвать adapter.notifyDataSetChanged() в onPostExecute, если данные адаптера изменились. или установить адаптер списка onPostExecute – kjurkovic

+0

Вау, все. Я был таким глупым. В любом случае, спасибо, чувак. Я из своего беспорядка. – Bernie

Смежные вопросы