在Android平台上,可能会经常会连续多次访问同一网络, 第一次调用结束后,再调用第二次,这样一般没有什么问题,

但是第一次正在处理的时候, 又调用了第二次,这个时候容易出现异常

处理方案一

1,  判断第一次请求处理是否结束,如果没有结束,那么不继续处理第二次请求,如果结束,进行第二次请求, 实现的代码很简单,在线程的开始和结束的时候设置flag ,代码如下

boolean running = false;

….

class URLTask extends AsyncTask<String, Integer, String> {

@Override
    protected String doInBackground(String… params) { // 在后台,下载url网页内容
        try {

            running = true;

…..处理网络

            running= false;

}

}

Button.setOnClickListenser(new OnClickListener(){

if(!running)

{

URLTask urlTask = new URLTask(this); // 实例化抽象AsyncTask
        urlTask.execute("http://www.baidu.com"); // 调用AsyncTask,传入url参数

}

})

处理方案二

判断第一次请求是否正在运行,如果没有运行,那么直接调用第二次,如果第一次正在运行,那么中止第一次调用,执行第二次调用, 全体的代码

public class MainActivity extends Activity {
    private EditText metURL;
    private TextView mtvPage;
    private Button mbtnConn;
    URLTask urlTask;
    HttpClient client = new DefaultHttpClient();

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

        metURL = (EditText) findViewById(R.id.etURL); // 输入网址
        mbtnConn = (Button) findViewById(R.id.btnConn); // 连接网站
        mtvPage = (TextView) findViewById(R.id.tvPage); // 显示网页

        mbtnConn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

               if (urlTask != null
                        && urlTask.getStatus() == AsyncTask.Status.RUNNING) {
                    // 判断AsyncTask是否正在运行,如果正在运行 那么取消掉这个
                    urlTask.cancel(true);
                }
                connURL();

            }
        });
    }

    private void connURL() {
        urlTask = new URLTask(this); // 实例化抽象AsyncTask
        urlTask.execute("http://www.baidu.com"); // 调用AsyncTask,传入url参数

    }

    int i = 0;

    /** 继承AsyncTask的子类,下载url网页内容 */
    class URLTask extends AsyncTask<String, Integer, String> {
        private static final String TAG = "MainActivity";
        ProgressDialog proDialog;

        public URLTask(Context context) {
            proDialog = new ProgressDialog(context, 0);
            proDialog.setButton("cancel",
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.cancel();
                        }
                    });
            proDialog
                    .setOnCancelListener(new DialogInterface.OnCancelListener() {
                        @Override
                        public void onCancel(DialogInterface dialog) {
                            finish();
                        }
                    });
            proDialog.setCancelable(true);
            proDialog.setMax(100);
            proDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            // proDialog.show();
        }

        @Override
        protected void onPreExecute() {
            mtvPage.setText(R.string.hello_world); // 可以与UI控件交互

            i++;
        }

        @Override
        protected String doInBackground(String… params) { // 在后台,下载url网页内容
            try {

                Log.e(TAG, "第" + i + "次调用开始");

                HttpGet get = new HttpGet(params[0]); // url
                HttpResponse response = client.execute(get);

                if (response.getStatusLine().getStatusCode() == 200) { // 判断网络连接是否成功
                    // String result =
                    // EntityUtils.toString(response.getEntity(),
                    // "gb2312"); // 获取网页内容
                    // return result;

                    HttpEntity entity = response.getEntity();
                    long len = entity.getContentLength(); // 获取url网页内容总大小
                    InputStream is = entity.getContent();

                    ByteArrayOutputStream bos = new ByteArrayOutputStream();
                    byte[] buffer = new byte[1024];
                    int ch = -1;
                    int count = 0; // 统计已下载的url网页内容大小
                    while (is != null && (ch = is.read(buffer)) != -1) {
                        bos.write(buffer, 0, ch);
                        count += ch;
                        if (len > 0) {
                            float ratio = count / (float) len * 100; // 计算下载url网页内容百分比
                            publishProgress((int) ratio); // android.os.AsyncTask.publishProgress(Integer…
                                                            // values)
                        }
                        Thread.sleep(300);
                    }
                    String result = new String(bos.toString("utf-8"));
                    Log.e(TAG, "第" + i + "次调用结束");
                    return result;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onProgressUpdate(Integer… values) { // 可以与UI控件交互
            mtvPage.setText("" + values[0]); // 获取
                                                // publishProgress((int)ratio)的values
            proDialog.setProgress(values[0]);
        }

        @Override
        protected void onPostExecute(String result) { // 可以与UI控件交互
            mtvPage.setText(result);
            proDialog.dismiss();
        }
    }
}

打印的日志

image

源代码下载zhaiaysnctask.zip

 

ps: 中止的时候会出现线程异常,但是不影响程序的正常运行