为了避免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代码:

<?xml version="1.0" encoding="utf-8"?>        

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

最后执行。

更多相关文章

  1. Flutter(三):实现Flutter代码调用Android原生代码(创建WebView Plu
  2. android使用handlerthread创建线程示例
  3. Android属性动画完全解析(中),ValueAnimator和ObjectAnimator的高
  4. Android(安卓)Context简介
  5. 【Android(安卓)Linux内存及性能优化】(五) 进程内存的优化 - 线
  6. Android中关于SQLite数据库的一些知识
  7. Android超精准计步器开发-Dylan计步
  8. Android(安卓)Activity生命周期
  9. Android(安卓)Notification点击按钮改变内容方案

随机推荐

  1. Android之通知使用权
  2. android 实现GridView多选效果
  3. Android(安卓)中 控制 wifi
  4. Android(安卓)3.0 honeycomb TextView on
  5. openCv CameraBridgeViewBase 竖屏显示对
  6. 关于SQLite数据库的那些事儿
  7. 命令行执行Android程序
  8. 在 Android(安卓)Studio 中配置源码路径
  9. Android之RecyclerView简单使用(三)
  10. 在eclipse环境中开发android原生应用