Диалог прогресса Android - PullRequest
       24

Диалог прогресса Android

7 голосов
/ 10 октября 2011

Мое приложение извлекает некоторый html-код из Интернета и по завершении отображает его на экране устройства.Поскольку для этого требуется около 3-4 секунд, в это время экран остается черным, я бы хотел использовать диалоговое окно прогресса.Это мой код:

package com.nextlogic.golfnews;



// ALL THE IMPORTS ....

public class Activity1 extends Activity {

    private ProgressDialog progressDialog;
 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main2);

        progressDialog = ProgressDialog.show(Activity1.this, "", "Loading...");
        new Thread() 
        {
          public void run() 
          {

             try
               {
                sleep(2000);

          // HERE I'VE PUT ALL THE FUNCTIONS THAT WORK FOR ME
 }
    catch (Exception e)
    {
        Log.e("tag",e.getMessage());
    }
// dismiss the progressdialog   
  progressDialog.dismiss();
 }
}.start();

Программа работает, но больше ничего не отображает.У меня есть одна ошибка в logcat:

Only the original thread that created a view hierarchy can touch its views.

Не могли бы вы мне помочь?Заранее спасибо.

Ответы [ 5 ]

17 голосов
/ 10 октября 2011

Ошибка достаточно объяснительная. Чтобы обновить один визуальный объект, вы должны выполнить изменения внутри основного потока. Быстрое и грязное исправление может вызывать код обновления внутри runOnUiThread () .

Однако в вашем случае я бы использовал AsyncTask для загрузки и обновления хода выполнения. У задачи есть свойство запускаться в потоке пользовательского интерфейса после ее завершения (так что вы можете обновить представления там, например, закрыть диалог прогресса)

Здесь - это пример использования AsyncTask для отображения диалога прогресса загрузки.

Обновление

Stackoverflow уже имеет ответы на все ваши вопросы. Здесь является примером AsyncTask для загрузки некоторого контента и отображения хода загрузки. Как раз то, что вы хотите.

Обновление 2

Хорошо, вот ваш код с использованием AsyncTask:

public class Activity1 extends Activity
{
    private ProgressDialog progressDialog;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        new AsyncTask<Integer, Integer, Boolean>()
        {
            ProgressDialog progressDialog;

            @Override
            protected void onPreExecute()
            {
                /*
                 * This is executed on UI thread before doInBackground(). It is
                 * the perfect place to show the progress dialog.
                 */
                progressDialog = ProgressDialog.show(Activity1.this, "",
                        "Loading...");
            }

            @Override
            protected Boolean doInBackground(Integer... params)
            {
                if (params == null)
                {
                    return false;
                }
                try
                {
                    /*
                     * This is run on a background thread, so we can sleep here
                     * or do whatever we want without blocking UI thread. A more
                     * advanced use would download chunks of fixed size and call
                     * publishProgress();
                     */
                    Thread.sleep(params[0]);
                    // HERE I'VE PUT ALL THE FUNCTIONS THAT WORK FOR ME
                }
                catch (Exception e)
                {
                    Log.e("tag", e.getMessage());
                    /*
                     * The task failed
                     */
                    return false;
                }

                /*
                 * The task succeeded
                 */
                return true;
            }

            @Override
            protected void onPostExecute(Boolean result)
            {
                progressDialog.dismiss();
                /*
                 * Update here your view objects with content from download. It
                 * is save to dismiss dialogs, update views, etc., since we are
                 * working on UI thread.
                 */
                AlertDialog.Builder b = new AlertDialog.Builder(Activity1.this);
                b.setTitle(android.R.string.dialog_alert_title);
                if (result)
                {
                    b.setMessage("Download succeeded");
                }
                else
                {
                    b.setMessage("Download failed");
                }
                b.setPositiveButton(getString(android.R.string.ok),
                        new DialogInterface.OnClickListener()
                        {

                            @Override
                            public void onClick(DialogInterface dlg, int arg1)
                            {
                                dlg.dismiss();
                            }
                        });
                b.create().show();
            }
        }.execute(2000);

        new Thread()
        {
            @Override
            public void run()
            {

                // dismiss the progressdialog
                progressDialog.dismiss();
            }
        }.start();
    }
}
4 голосов
/ 10 октября 2011

Вы должны сделать это так

runOnUiThread(new Runnable() {
    public void run() {
      // Do Your Stuff
    }});
2 голосов
/ 10 октября 2011

Закрыть ваш диалог так:

Handler handler = new Handler();
handler.post(new Runnable(){
   public void run(){
      progressDialog.dismiss();
   }
});
1 голос
/ 10 октября 2011

Создание потока пользовательского интерфейса после завершения сетевой операции

runOnUiThread(new Runnable() { 
            @Override 
            public void run() { 
             progressDialog.dismiss();

            } 
        });
0 голосов
/ 08 мая 2013

Отличный ответ отлично работает, поэтому вот пример реализации AsyncTask в MonoDroid (спасибо Грегу Шакелсу): http://mono -for-android.1047100.n5.nabble.com / AsyncTask-td4346647.HTML

...