Android事件处理之使用异步任务执行下载

为了避免UI线程失去响应的问题,Android建议将耗时操作放在新线程中完成。AsyncTask相较于Handler更加轻量级,适用于简单的异步处理。本例示范如何使用异步任务下载网络资源,布局包括一个文本框和一个按钮,当指定一个网页时,程序会下载该网页的源代码,并显示在文本框中,按钮用于激发下载任务。

1.MainActivity代码:

package com.example.asynctask;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.security.ProtectionDomain;

public class MainActivity extends Activity {

    private TextView show;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        show = findViewById(R.id.show);
    }
    //按钮点击事件
    public void download(View view) throws MalformedURLException {
        DownTask task = new DownTask(this);
        task.execute(new URL("https://www.csdn.net/"));
    }
    class DownTask extends AsyncTask{
        //定义一个进度条
        ProgressDialog pdialog;
        //定义记录已经读取行的数量
        int hasRead = 0;
        Context mContext;
        public DownTask(Context mContext) {
            this.mContext = mContext;
        }

        @Override
        protected String doInBackground(URL... urls) {
            StringBuilder sb = new StringBuilder();
            try{
                URLConnection conn = urls[0].openConnection();
                //打开conn连接对应的输入流,并将它包装成BufferedReader
                BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream() , "utf-8"));
                String line = null;
                while ((line = br.readLine()) != null){
                    sb.append(line + "\n");
                    hasRead++;
                    //该方法是doInBackground()里面的方法,用于更新任务的执行进度
                    publishProgress(hasRead);
                }
                return sb.toString();
            }catch (Exception e){
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(String s) {
            //当doInBackground()方法执行完成之后,系统会自动调用onPostExecute()方法
            //并将doInBackground()方法的返回值传给该方法
            //返回HTML页面的内容
            show.setText(s);
            pdialog.dismiss();
        }

        @Override
        protected void onPreExecute() {
            pdialog = new ProgressDialog(mContext);
            pdialog.setTitle("下载任务");
            pdialog.setMessage("任务正在执行中,请稍等...");
            pdialog.setCancelable(false);
            pdialog.setMax(202);
            pdialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            pdialog.setIndeterminate(false);
            pdialog.show();
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            //更新进度
            show.setText("已经读取了【" + values[0] + "】 行 ");
            pdialog.setProgress(values[0]);
        }
    }
}

2.XML代码:




    
    

3.由于获取网上资源属于联网操作,所以需要在AndroidManifest.xml中添加

最后执行。

你可能感兴趣的:(Android)