#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);
}
}