萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> 安卓開發 >> 解決如何讓AsyncTask終止操作

解決如何讓AsyncTask終止操作

 受到這個的啟發終於結局了如何在AsyncTask運行中終止其操作。

單純的onCancelled(true)是不行的

下面把代碼貼出來~實現了登陸功能。

AsyncTask簡介,它使創建需要與用戶界面交互的長時間運行的任務變得更簡單。相對來說AsyncTask更輕量級一些,適用於簡單的異步處理,不需要借助線程和Handler即可實現。

package com.isummation.exampleapp;
 
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URLEncoder;
import java.net.UnknownHostException;
 
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.CoreProtocolPNames;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.HttpContext;
import org.json.JSONObject;
 
import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
 
public class UserLogin extends Activity {
 
    private EditText etUsername;
    private EditText etPassword;
    private ProgressDialog progressDialog;
    private static final int PROGRESSDIALOG_ID = 0;
    private static final int SERVER_ERROR = 1;
    private static final int NETWORK_ERROR = 2;
    private static final int CANCELLED = 3;
    private static final int SUCCESS = 4;
    private String ServerResponse;
    private LoginTask loginTask;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login);
 
        etUsername = (EditText) findViewById(R.id.txt_username);
        etPassword = (EditText) findViewById(R.id.txt_password);
 
        Button login_button = (Button) this.findViewById(R.id.login_button);
        login_button.setOnClickListener(new OnClickListener() {
            public void onClick(View viewParam) {
                if (etUsername.getText().toString().length() == 0
                        || etPassword.getText().toString().length() == 0) {
                    Toast.makeText(getApplicationContext(),
                            "Please enter username and password",
                            Toast.LENGTH_SHORT).show();
                } else {
 
                    //Show dialog by passing id
                    showDialog(PROGRESSDIALOG_ID);
                }
            }
        });
    }
 
    protected Dialog onCreateDialog(int id) {
        switch(id) {
        case PROGRESSDIALOG_ID:
            removeDialog(PROGRESSDIALOG_ID);
 
            //Please note that forth parameter is true for cancelable Dialog
            //Also register cancel event listener
            //if the litener is registered then forth parameter has no effect
            progressDialog = ProgressDialog.show(UserLogin.this, "Authenticating",
                    "Please wait...", true, true, new OnCancelListener(){
 
                        public void onCancel(DialogInterface dialog) {
                            //Check the status, status can be RUNNING, FINISHED and PENDING
                            //It can be only cancelled if it is not in FINISHED state
                            if (loginTask != null && loginTask.getStatus() != AsyncTask.Status.FINISHED)
                                loginTask.cancel(true);
                        }
                    });
            break;
        default:
            progressDialog = null;
        }
        return progressDialog;
    }
 
    @Override
    protected void onPrepareDialog(int id, Dialog dialog) {
        switch (id) {
        case PROGRESSDIALOG_ID:
            //check if any previous task is running, if so then cancel it
            //it can be cancelled if it is not in FINISHED state
            if (loginTask != null && loginTask.getStatus() != AsyncTask.Status.FINISHED)
                loginTask.cancel(true);
            loginTask = new LoginTask(); //every time create new object, as AsynTask will only be executed one time.
            loginTask.execute();
        }
    }
 
    class LoginTask extends AsyncTask<Void, Integer, Void> {
        @Override
        protected Void doInBackground(Void... unused) {
            try {
                ServerResponse = null; //don't forget to make it null, as task can be called again
                HttpClient httpClient = new DefaultHttpClient();
                HttpContext localContext = new BasicHttpContext();
                HttpGet httpGet = new HttpGet(
                        getString(R.string.WebServiceURL)
                                + "/cfc/iphonewebservice.cfc?returnformat=json&method=validateUserLogin&username="
                                + URLEncoder.encode(etUsername.getText()
                                        .toString(), "UTF-8")
                                + "&password="
                                + URLEncoder.encode(etPassword.getText()
                                        .toString(), "UTF-8"));
                httpClient.getParams().setParameter(
                        CoreProtocolPNames.USER_AGENT,"Some user agent string");
 
                //call it just before you make server call
                //calling after this statement and canceling task will no meaning if you do some update database kind of operation
                //so be wise to choose correct place to put this condition
                //you can also put this condition in for loop, if you are doing iterative task
 
                //now this very important
                //if you do not put this condition and not maintaining execution, then there is no meaning of calling .cancel() method
                //you should only check this condition in doInBackground() method, otherwise there is no logical meaning
                if (isCancelled())
                {
                    publishProgress(CANCELLED); //Notify your activity that you had canceled the task
                    return (null); // don't forget to terminate this method
                }
                HttpResponse response = httpClient.execute(httpGet,
                        localContext);
 
                BufferedReader reader = new BufferedReader(
                        new InputStreamReader(
                                response.getEntity().getContent(), "UTF-8"));
                ServerResponse = reader.readLine();
                publishProgress(SUCCESS); //if everything is Okay then publish this message, you may also use onPostExecute() method
            } catch (UnknownHostException e) {
                removeDialog(PROGRESSDIALOG_ID);
                e.printStackTrace();
                publishProgress(NETWORK_ERROR);
            } catch (Exception e) {
                removeDialog(PROGRESSDIALOG_ID);
                e.printStackTrace();
                publishProgress(SERVER_ERROR);
            }
            return (null);
        }
 
        @Override
        protected void onProgressUpdate(Integer... errorCode) {
            switch (errorCode[0]) {
            case CANCELLED:
                removeDialog(PROGRESSDIALOG_ID);
                Toast.makeText(getApplicationContext(), &
						
copyright © 萬盛學電腦網 all rights reserved