Android — Действие при выходе из диалога выполнения

#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). Я не знаю, имеет ли это какое-либо значение или нет.