Пример AsynTask


Как я пытался прояснить функции AsyncTask Android, я написал пример приложения, чтобы проверить его. Пожалуйста, просмотрите мой код и предложить возможные улучшения:

public class AsyncTaskExampleActivity extends Activity implements OnClickListener{

    private Boolean success = true;
    private static AsyncTaskExampleActivity MainActivityInstance;
    private CallBack c;
    ProgressDialog progressDialog;
    Button startAsyncTask;
    MyAsyncTask aTask;
    Button cancelAsyncTask;


    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        startAsyncTask = (Button)findViewById(R.id.button1);
        cancelAsyncTask = (Button)findViewById(R.id.button2);
        startAsyncTask.setOnClickListener(this);
        cancelAsyncTask.setOnClickListener(this);
        MainActivityInstance = this;

        //ProgressDialog progressDialog;
        progressDialog = new ProgressDialog(this.getApplicationContext());
        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        progressDialog.setMessage("On Progress...");
        progressDialog.setCancelable(false);

        c = new CallBack() {
            public void onProgress(){
                //progressDialog.show();
                Toast toast = Toast.makeText(getMainActivity().getApplicationContext(), "Progress!!", 1000);
                toast.show();
            }

            public void onResult(Boolean result){
                if(result.equals(true)){
                    Toast toast = Toast.makeText(getMainActivity().getApplicationContext(), "Bingo...Success!!", 1000);
                    toast.show();
                }

                else {
                    Toast toast = Toast.makeText(getMainActivity().getApplicationContext(), "Alas!! Failure", 1000);
                    toast.show();
                }
            }

            public void onCancel(Boolean result){
                Toast toast = Toast.makeText(getMainActivity().getApplicationContext(), "Cancelled", 1000);
                toast.show();
            }
        };

        aTask = new MyAsyncTask(c);
    }   
    static AsyncTaskExampleActivity getMainActivity(){
        return MainActivityInstance;
    }

    public Boolean getSuccessOrFailureResult(){
        return success;
    }

    public void onClick(View v){
        if(v.equals(startAsyncTask)){
            aTask.execute("Start");
        }
        if(v.equals(cancelAsyncTask)){
            aTask.cancel(true);
        }
    }
}

public class MyAsyncTask extends AsyncTask<String, Integer, Boolean> {

    private CallBack cb;
    Boolean running = true;
    MyAsyncTask(CallBack cb){

        this.cb = cb;
    }

    protected Boolean doInBackground(String... params){


            while(running){
                       if(isCancelled()){
                   break;
                     }
                try{
                    for (int i = 0; i<5; i++){
                                        if(isCancelled()){
                                    break;
                                      }
                        Thread.sleep(10000,0);
                        publishProgress();
                    }
                }
                    catch(InterruptedException e){
                        return false;
                    }           

                return true;
        }
        return false;
    }

    protected void onProgressUpdate(Integer... progress){
        cb.onProgress();
    }

    protected void onPostExecute(Boolean result){

        cb.onResult(result);

    }

    protected void onCancelled(){

        running = false;
        cb.onCancel(true);

    }

}

public interface CallBack {

    public void onProgress();
    public void onResult(Boolean result);
    public void onCancel(Boolean result);
}


Комментарии
1 ответ


  • Если повернуть экран, то активность будет перегружаться, что приведет к перезапуску задания, а также (возможно, даже аварии из-за ProgressDialog). В конце концов, я обнаружил, что может правильно только услуги обработки длительных операций. Но они более сложны в код.

  • Вы не следуете правилам наименования с Android, и несколько имен, не имеют никакого смысла вообще. Например AsyncTaskExampleActivity.С должны быть названы AsyncTaskExampleActivity.mCallback

2
ответ дан 23 декабря 2011 в 01:12 Источник Поделиться