#java #android #progressdialog
#java #Android #progressdialog
Вопрос:
Я пытаюсь написать довольно простое приложение для своего телефона, просто чтобы вернуться к программированию. У меня есть структура и основы того, что я хочу сделать, мне просто нужна помощь в небольшом разделе, который меня убивает.
В моем приложении у меня есть кнопка. Когда эта кнопка нажата, я хочу, чтобы приложение изменило фрагмент текста на «Решение …», на секунду или две отобразился неопределенный индикатор выполнения, затем выйдите, затем распечатайте результат другого действия, но только после завершения диалога. В данный момент я использую поток, но не могу заставить его функционировать правильно.
У кого-нибудь есть идеи, как заставить его работать так, как я хочу?
Вот мой источник файла активности:
package com.bassios.decisionengine;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
public class DecisionEngineActivity extends Activity {
private ProgressDialog progressDialog;
public String decision;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public void decide(View view) {
TextView tv = (TextView) findViewById(R.id.Decision1);
tv.setText("Deciding...");
int a = generate();
decision = decision(a);
runDialog(1);
// alterText();
}
public void alterText() {
TextView tv = (TextView) findViewById(R.id.Decision1);
tv.setText(decision);
}
private void runDialog(final int seconds) {
progressDialog = ProgressDialog.show(this, "Please wait...", "Deciding...");
new Thread(new Runnable() {
public void run() {
try {
Thread.sleep(seconds * 1000);
progressDialog.dismiss();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
public static int generate() {
int a = (int) (Math.random() * 10) 1;
return a;
}
public static String decision(int a) {
String decision = null;
switch (a) {
case 1:
decision = "Yes";
break;
case 2:
decision = "No";
break;
case 3:
decision = "Yes";
break;
case 4:
decision = "No";
break;
case 5:
decision = "Yes";
break;
case 6:
decision = "No";
break;
case 7:
decision = "Yes";
break;
case 8:
decision = "No";
break;
case 9:
decision = "Yes";
break;
case 10:
decision = "No";
break;
}
return decision;
}
}
Спасибо!
Комментарии:
1. Попробуйте использовать
AsyncTask
вместоThread
, вы не можете изменить состояние пользовательского интерфейса с другогоThread
Ответ №1:
Используйте AsyncTask.
Пример:
http://javatech.org/2011/02/discovering-android-opening-a-progress-dialog-with-asynctask/
Обновить:
Прежде всего, вы должны объявить класс следующим образом:
private class DecideTask extends AsyncTask<Void, Void, Boolean>
{
...
}
Я не знаю, как showDialog
и removeDialog
работает, но вместо этого я бы сделал это так:
Показать диалоговое окно (в onPreExecute
):
progressDialog = ProgressDialog.show(this, "Please wait...",
"Deciding...", true);
Удалить / закрыть диалоговое окно (в onPostExecute
):
progressDialog.dismiss();
Объявление каждого из трех методов:
protected Boolean doInBackground(Void... params)
protected void onPreExecute()
protected void onPostExecute(Boolean result)
Это должно сделать это.
Комментарии:
1. Я пытаюсь использовать этот пример, но когда я вставляю его, чтобы изменить его, я получаю следующее: com.bassios.decisionengine. DecisionEngineActivity.decideTask не является абстрактным и не переопределяет абстрактный метод doInBackground(java.lang. Объект …) в android.os. AsyncTask
2. Я поместил его в PasteBin, потому что он слишком длинный, чтобы поместиться в комментариях здесь: pastebin.com/2BpZssjV
3. Что произойдет, если вы не раскомментируете переопределение над методом doInBackground?
4. В любом случае я все равно получаю ту же ошибку. Раскомментирование @Override дает мне «Метод не переопределяет и не реализует метод из супертипа»
5. Извиняюсь за поздний ответ, вчера меня не было. Сейчас у меня работает большая часть, но диалоговое окно не работает. Я получаю огромное сообщение об ошибке в строке ProgressDialog = ProgressDialog.show(…); сейчас. Я загрузил сообщение об ошибке в виде скриншота для вас, оно слишком велико для ввода. i42.tinypic.com/2evxjj7.jpg РЕДАКТИРОВАТЬ: я, вероятно, должен упомянуть, что я разрабатываю в NetBeans, потому что Eclipse не будет работать (он не смог найти мою jvm). Я не знаю, имеет ли это какое-либо значение или нет.