2012-03-06 7 views
0

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

Вот мой код:

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

небось проблема заключается в том, что вы делаете все эту работу на потоке пользовательского интерфейса, так что момент, когда вы начинаете диалог, нить, которая начинается и показывает, что окно действительно замерзает, когда вы выполняете работу 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

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

+0

я постараюсь сделать это в AsyncTask тогда я буду держите вас в курсе новостей за ваш ответ –

+0

Работая, вы просто пропустили возврат в функции doInBackground, спасибо! –

0

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

Основная нить, чтобы решить проблему:

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 диалог должен быть отменен в потоке пользовательского интерфейса

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

E.G.

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

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

if ((String)msg.obj.equals("ERROR")) { /* Handle Error */ } 
+0

Вы не можете вызвать dialog.cancel из фонового потока. Это должно быть сделано из потока пользовательского интерфейса. Это не будет работать так, как есть. – Wizetux

+0

Отредактировано с помощью обработчика – bbedward

Смежные вопросы