Создание ProgressDialog для загрузки - PullRequest
0 голосов
/ 20 марта 2012

У меня есть этот фрагмент с этого сайта.

final ProgressDialog dialog = ProgressDialog.show(this, "Title", 
"Message", true);
final Handler handler = new Handler() {
   public void handleMessage(Message msg) {
      dialog.dismiss();
      }
   };
Thread checkUpdate = new Thread() {  
   public void run() {
//
// YOUR LONG CALCULATION (OR OTHER) GOES HERE
//
      handler.sendEmptyMessage(0);
      }
   };
checkUpdate.start();

Я не до конца понимаю, как он полностью работает, за исключением того факта, что он создает новый поток для выполнения ProcessDialog до завершения процесса.

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

Мой вопрос

Как можно было бы запустить этот код, не переходя в ноль исключение указателя?

Есть ли другое альтернативное решение для выполнения чего-то похожего на это?

1 Ответ

0 голосов
/ 20 марта 2012

Более элегантный и предпочтительный способ сделать это - использовать AsyncTask :

private class DownloadTask extends AsyncTask<Object, Object, Object>
    {
        @Override
        protected Object doInBackground(final Object... urls)
        {
           // long calculation

            return null;
        }

        @Override
        protected void onPostExecute(final Object result)
        {
            closeDialog();
        }

        @Override
        protected void onPreExecute()
        {
            showDialog();
        }
    }

private void closeDialog()
    {
        if (dialog != null)
        {
            dialog.dismiss();
        }
    }

    private void showDialog()
    {
        if (dialog !=null && !dialog.isShowing())
        {
            dialog = new ProgressDialog(this);
            dialog.setMessage("Loading. Please wait...");
            dialog.show();

        }

    }

Позвоните по этой строке:

new DownloadTask().execute();
...