Диалоговое окно выполнения с потоком

#android #multithreading #progressdialog

#Android #многопоточность #progressdialog

Вопрос:

я работаю над управлением просмотром списка в Android. когда я нажимаю на элемент просмотра списка, мне нужно одно диалоговое окно прогресса, и после поступления запрошенных данных я хочу его остановить

ну, я помещаю это диалоговое окно в поток, и когда поток останавливается, я хочу отобразить другое диалоговое окно, но на самом деле оно не работает, оно выдает ошибку, указанную ниже

05-10 15:05:10.607: ОШИБКА / AndroidRuntime (820): Неперехваченный обработчик: поток MagentoBackground завершается из-за неперехваченного исключения **05-10 15:05:10.617: ОШИБКА / AndroidRuntime (820): исключение java.lang.RuntimeException: не удается создать обработчик внутри потока, который не вызывал Looper.prepare()

Мой код выглядит следующим образом

            Runnable viewQuestions = new Runnable(){
            public void run() {
                getViewAnswer(answerBean);
            }


        };
       thread =  new Thread(null, viewQuestions, "MagentoBackground");
       thread.start();
       m_ProgressDialog = ProgressDialog.show(context, "Please wait...", "Retrieving data ...", true);



      protected void getViewAnswer(AnswerBean answerBean) {
          //fetch data code
            if(viewAnswerBeans != null amp;amp; viewAnswerBeans.size() > 0){
             m_ProgressDialog.dismiss();
             viewAndGiveAnswerDialog(viewAnswerBeans);
                             dialogbox.show();

         } else {
             m_ProgressDialog.dismiss();
                     dialogBox.show();

         }
      }
  

моя проблема в том, что это «DialogBox.show();» не будет работать, оно не будет отображать сообщение

может ли кто-нибудь помочь мне в этом

Ответ №1:

для этих целей я предлагаю вам использовать AsyncTask

Ответ №2:

Это потому, что вы вызываете компонент пользовательского интерфейса из потока, отличного от пользовательского интерфейса. Взгляните на следующую ссылку

http://developer.android.com/resources/articles/painless-threading.html

Ответ №3:

Используйте обработчик

 private Handler gps_ws_handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
            m_ProgressDialog.dismiss();
            dialogBox.show();


    }
};
  

Ответ №4:

Создайте обработчик в рамках вашего действия.

 Handler handler = new Handler();
  

Затем внутри getViewAnswer отправьте ему сообщение.

 protected void getViewAnswer(AnswerBean answerBean) {

    //fetch data code


    handler.post(new Runnable() {
    @Override
    public void run() {
        if(viewAnswerBeans != null amp;amp; viewAnswerBeans.size() > 0){
        m_ProgressDialog.dismiss();
        viewAndGiveAnswerDialog(viewAnswerBeans);
                     dialogbox.show();

         } else {
        m_ProgressDialog.dismiss();
             dialogBox.show();

         }
    }
});
  }
  

Ответ №5:

Для фоновых задач используйте AsyncTask с ограниченным ProgressDialog, как показано здесь.

Ответ №6:

Попробуйте это

публичный класс YourActivity расширяет активность {

 private ProgressDialog m_ProgressDialog = null;
private Runnable viewOrders;
private ListView mListView;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.yourLayout);

    viewOrders = new Runnable() {

        public void run() {
            loadList();
        }
    };

    Thread thread = new Thread(null, viewOrders, "MagentoBackground");
    thread.start();
    m_ProgressDialog = ProgressDialog.show(YourActivity.this, "",
            "Get Data...", true);

}

private Runnable returnRes = new Runnable() {

    public void run() {



            mListView = (ListView) findViewById(R.id.yourList);

            //create here your adapter 

            mListView.setAdapter(yourAdapter);
            mListView.setOnItemClickListener(new OnItemClickListener() {

                public void onItemClick(AdapterView<?> arg0, View v,
                        int position, long arg3) {

                    //on item click
                }
            });
        }
        m_ProgressDialog.dismiss();
    }
};

private void loadList() {
    try {
        /* Make your request Here
                    The progress Dialog is dismissed automatically after request is  finished */
        }

        Thread.sleep(1000);

    } catch (Exception e) {
    }

    runOnUiThread(returnRes);
}
  

}