Не удается запустить пример асинхронности..?

Когда я пытался запустить код, работает только главный тост. Диалог хода выполнения и другие всплывающие сообщения не запущены. Эта программа представляет собой простой асинхронный пример для спящего процесса. Основная проблема заключается в том, что он не отображает Progressdialog.

Мне нужно добавить XML-файл (он содержит только textView и кнопку). Пожалуйста, помогите мне решить эту проблему. Спасибо

package com.example.asyncexample;

import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.Toast;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;


    public class MainActivity extends Activity {


ProgressDialog progressBar;
int prorgessInc = 1;            // incrementing the progress dialog

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button button = (Button) findViewById(R.id.start_button);
    button.setOnClickListener(startTaskListener);
    }


private OnClickListener startTaskListener =  new OnClickListener() {

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
    Context context = getApplicationContext();

    progressBar = new ProgressDialog(v.getContext());

    BackgroundTask test = new BackgroundTask(); 

        test.execute(context);

        CharSequence text = "Main Thread is Running";
        int duration = Toast.LENGTH_LONG;
        Toast toast = Toast.makeText(context, text, duration);
        toast.show();
    }
};

private class BackgroundTask extends AsyncTask<Context, Integer, String>{
    protected void OnPreExecute() {
        CharSequence msg = "BackgroundTask is Operating";
        progressBar.setCancelable(true);
        progressBar.setMessage(msg);
        progressBar.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        progressBar.setProgress(0);
        progressBar.setMax(100);
        progressBar.show();

    }

    @Override
    protected String doInBackground(Context... params) {
        //BackgroundTask Is Running
        for(int i =0; i<=100; i+=prorgessInc){
            try {Thread.sleep(100);}
        catch (InterruptedException e) { e.printStackTrace();}

            publishProgress(prorgessInc);

            if(isCancelled()) break;
            }

        return getString(R.string.backgndcompld);
    }

    protected void OnProgressUpdate(Integer...values ) {
            //Update Progress bar
        progressBar.incrementProgressBy(prorgessInc);

    }

    protected void PostExecute(String result){
        //Dissmiss progressbar 
        progressBar.dismiss();

        Context context = getApplicationContext();
        int duration  = Toast.LENGTH_LONG;
        Toast toast2 = Toast.makeText(context, result, duration);
        toast2.show();
    }

}
}       

1 ответ

Правильно, ваша проблема в том, что вы называете метод AsyncTask.

Вы определили:

  • защищенный void OnPreExecute()
  • защищенный void OnProgressUpdate()
  • защищенный void PostExecute()

Однако настоящие методы:

  • защищенный void onPreExecute()
  • защищенный void onProgressUpdate()
  • защищенный void onPostExecute()

Обратите внимание на разницу в случае. Если бы вы использовали @Override как показано ниже, ваша IDE, вероятно, показала бы вам это.

Я сделал некоторую очистку этого и других частей вашего кода. Взглянуть:

public class MainActivity
        extends Activity
        implements View.OnClickListener
{

    private Button button;
    private ProgressDialog progressBar;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_example);
        button = (Button) findViewById(R.id.start_button);
        button.setOnClickListener(this);
    }

    @Override
    public void onClick(View v)
    {
        Log.d("click", "start button clicked, starting task");
        BackgroundTask test = new BackgroundTask();
        test.execute();
    }

    private class BackgroundTask
            extends AsyncTask<Void, Integer, String>
    {

        int PROGRESS_INCREMENT = 1;
        int PROGRESS_MAX = 100;
        String DIALOG_MSG = "AsyncTask is Operating";

        @Override
        protected void onPreExecute()
        {
            progressBar = new ProgressDialog(getApplicationContext());
            progressBar.setCancelable(true);
            progressBar.setMessage(DIALOG_MSG);
            progressBar.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            progressBar.setProgress(0);
            progressBar.setMax(PROGRESS_MAX);
            progressBar.show();
        }

        @Override
        protected String doInBackground(Void... params)
        {
            for (int i = 0; i <= 100; i += PROGRESS_INCREMENT)
            {
                try
                {
                    Thread.sleep(100);
                }
                catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
                publishProgress(PROGRESS_INCREMENT);
                if (this.isCancelled())
                {
                    break;
                }
            }
            return "[some result text]";
        }

        @Override
        protected void onProgressUpdate(Integer... values)
        {
            progressBar.incrementProgressBy(PROGRESS_INCREMENT);
        }

        @Override
        protected void onPostExecute(String result)
        {
            progressBar.dismiss();
            Toast.makeText(getApplicationContext(),
                            result,
                            Toast.LENGTH_LONG)
                            .show();
        }
    }
}

Заметные изменения:

  • В Activity реализован View.OnClickListener, поэтому вы можете переместить метод onClick() в Activity, исключив анонимный внутренний класс.
  • Кнопка перемещена в область видимости уровня класса. Определение его в вашем слушателе может быть подвержено ошибкам.
  • подготовьте и отобразите ваш PrgressDialog из метода onPreExecute (). Вот для чего это.
  • Убрал тост. Нет необходимости использовать все эти переменные и тратить пространство на ненужные объекты.
  • Вместо сообщений Toast используйте встроенный журнал для отладочных сообщений. Тостовые сообщения могут очень быстро начать распространять спам на вашем экране, и из-за того, что длина дисплея очень неточна, чтобы знать, когда что-то происходит.
Другие вопросы по тегам