Android AsyncTask проблема - PullRequest
       21

Android AsyncTask проблема

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

Я разработал приложение, которое берет контент из Интернета и показывает его соответствующим образом на экране устройства. Программа работает просто отлично, немного медленно. Загрузка и отображение контента занимает около 3-4 секунд. Я хотел бы поместить весь код, который выбирает содержимое и отображает его в фоновом потоке, и пока программа выполняет эти функции, я хотел бы отобразить диалоговое окно прогресса. Не могли бы вы помочь мне сделать это? Я хотел бы особенно узнать, как поместить код в фоновом потоке. МОЙ КОД

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();
    }
}

Приложение падает, NullPointerException среди других вещей . Не могли бы вы помочь мне ? спасибо.

Ответы [ 2 ]

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

С вашим кодом все в порядке, за исключением последнего потока, который, помимо того, что он бесполезен, является причиной сбоя вашего приложения: когда поток запускается, progressDialog еще не инициализируется.

В противном случае это должноработать как талисман.

Редактировать

Еще одна вещь: присвоение null в качестве onClickListener для положительной или отрицательной кнопки просто закрывает диалог (что вы делаете), поэтому

b.setPositiveButton(android.R.string.ok, null);

эквивалентно, только короче.

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

Загрузка выполняется методом doInBackground().Теперь вам нужно переопределить onProgressUpdate() метод, в котором вы будете делать .setProgress() на вашем индикаторе прогресса.onProgressUpdate() работает на пользовательском интерфейсе.Используйте метод .publishProgress(), откуда (из фонового потока, т. Е. doInBackground() method) вы сделаете вызов onProgressUpdate().

Надеюсь, эта идея вам поможет.

http://developer.android.com/reference/android/os/AsyncTask.html#publishProgress(Progress...)

...