Android, диалоговое окно ожидания не отображается вообще - PullRequest
0 голосов
/ 07 марта 2012

Я хочу показать диалоговое окно ожидания, но оно вообще не отображается, что странно, потому что очень много времени занимает функция setData (), где я получаю фид json и сохраняю их в базе данных (это занимает 3/5 секунд).

Вот мой код:

    ProgressDialog dialog = ProgressDialog.show(TabLayoutActivity.this, "", "Loading. Please wait...", true);

    //refresh the view
    taskLiteApplication.setData();

    //change view
    Intent myIntent = new Intent(TabLayoutActivity.this, TabLayoutActivity.class);
    TabLayoutActivity.this.startActivity(myIntent);

    //kill the dialog waiting
    dialog.cancel();

Ответы [ 2 ]

2 голосов
/ 07 марта 2012

Бьюсь об заклад, проблема в том, что вы выполняете всю эту работу в потоке пользовательского интерфейса, поэтому в момент, когда вы запускаете диалоговое окно, поток, который запускается и показывает, что окно фактически останавливается, пока вы выполняете setData () Работа. Вы действительно должны переместить функцию setData в фоновый поток или AsyncTask, чтобы поток пользовательского интерфейса мог продолжать работу, пока вы выполняете тяжелую работу в фоновом режиме.

private ProgressDialog dialog;

void doStuff()
{
    dialog = ProgressDialog.show(TabLayoutActivity.this, "", "Loading. Please wait...", true);
    HeavyTask task = new HeavyTask();
    task.execute();
}

private class HeavyTask extends AsyncTask<Void, Void, Void> {
     protected Void doInBackground(Void... args) {
         //refresh the view
         taskLiteApplication.setData();
         return;
     }

     protected void onPostExecute(Void results) {
         //change view
         Intent myIntent = new Intent(TabLayoutActivity.this, TabLayoutActivity.class);
         TabLayoutActivity.this.startActivity(myIntent);

         //kill the dialog waiting
         dialog.dismiss();
         dialog = null;
     }
 }
0 голосов
/ 07 марта 2012

Я предполагаю, что taskLiteApplication.setData ();работает в потоке пользовательского интерфейса вместо фонового потока или работает в фоновом потоке, и вызывается отмена, потому что он отменяется в потоке пользовательского интерфейса.

Основной поток для устранения проблемы:

private ProgressDialog dialog; // Keep this global
private Handler mHandler;

void doStuff() {
    dialog = ProgressDialog.show(TabLayoutActivity.this, "", "Loading. Please wait...",  true);
    mHandler = new Handler()
    {
        @Override public void handleMessage(Message msg) {
            if (msg.obj != null) {
                dialog.dismiss();
                //change view
                Intent myIntent = new Intent(TabLayoutActivity.this, TabLayoutActivity.class);
                TabLayoutActivity.this.startActivity(myIntent);
            }
        }
    };
    //refresh the view
    Thread t = new Thread(new Runnable() {
        @Override public void run() {
            // Assuming setData does NOT run on it's own background thread
            taskLiteApplication.setData();
            Message message = Message.obtain();
            message.obj = "DONERAEREAR";
            mHandler.sendMessage(message);
        }
    })};
    t.start();
}

EDIT Добавлен обработчик, как указал Wizetux, диалог должен быть отменен в потоке пользовательского интерфейса

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

EG

message.obj = "ERROR";
mHandler.sendMessage(message);

затем в обработчике

if ((String)msg.obj.equals("ERROR")) { /* Handle Error */ }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...