Android AsyncTask 异步任务

来源:互联网 发布:淘宝展现量 编辑:程序博客网 时间:2024/06/07 01:03

摘自《疯狂Android讲义 第3版》

AsyncTask<Params, Progress, Result>是一个抽象类,通常被继承,继承AsyncTask时需要指定如下三个泛型参数:

1.Params:启动任务执行的输入参数的类型。

2.Progress:后台任务完成的进度值的类型。

3.Result:后台任务执行完成后返回结果的类型。


使用AsyncTask只需要三个步骤:

1.创建AsyncTask的子类,并为三个泛型参数指定类型。如果某个泛型参数不需要指定类型,可将其设为void

2.根具需要,实现AsyncTask如下方法:

   a.doInBackground(Params...):重写该方法就是后台线程将要完成的任务。该方法可以调用publishProgress(Progress... values)方法更新任务的执行进度。

   b.onProgressUpdate(Params... values):在doInBackground()方法中调用publishProgress方法更新任务的执行进度后,将会触发该方法。

   c.onPreExecute():该方法在执行后台耗时操作前被调用。通常该方法用于完成一些初始化的准备工作,比如在界面显示进度条等。

   d.onPostExecute(Result result):当doInBackground()完成后,系统会自动调用onPostExecute()方法,并将doInBackground()方法的返回值传给该方法。

3.调用AsyncTask子类的实例的execute(Params... params)开始执行耗时操作。


使用AsyncTask时必须遵循以下规则:

1.必须在UI线程中创建AsyncTask的实例。

2.必须在UI线程中调用AsyncTask的execute()方法。

3.AsyncTask的onPreExecute(),onPostExectue(),doInBackground(),onProgressUpdate()方法不应该由程序员调用,面是由系统负责调用。

4.每个AsyncTask只能被执行一次,多次调用将会引发异常。




因本程序使用了网络功能,所以需要在Mainfest.xml里加入此权限:

<uses-permission android:name="android.permission.INTERNET" />


<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    tools:context="shortcut.song.com.myapplication.AsyncTaskActivity">    <Button        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="Down"        android:onClick="download"        />    <TextView        android:id="@+id/text_show"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:hint="some string"/></LinearLayout>

package shortcut.song.com.myapplication;import android.app.ProgressDialog;import android.content.Context;import android.os.AsyncTask;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.TextView;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.MalformedURLException;import java.net.URL;import java.net.URLConnection;public class AsyncTaskActivity extends AppCompatActivity {    private TextView show;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_async_task);        show = (TextView)findViewById(R.id.text_show);    }    public void download(View v) throws MalformedURLException    {        DowndLoadTask task = new DowndLoadTask(this);        task.execute(new URL("http://www.crazyit.org/ethos.php"));    }    class DowndLoadTask extends AsyncTask<URL, Integer, String>    {        ProgressDialog progressDialog;        int hasRead = 0;        Context mContext;        public DowndLoadTask(Context context)        {            mContext = context;        }        @Override        protected String doInBackground(URL... params) {            StringBuilder sb = new StringBuilder();            try{                URLConnection conn = params[0].openConnection();                BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(),"utf-8"));                String line = null;                while((line = br.readLine()) != null)                {                    sb.append(line + "\n");                    hasRead++;                    publishProgress(hasRead);                }                return sb.toString();            }catch(Exception e){            }            return null;        }        @Override        protected void onPostExecute(String s) {            super.onPostExecute(s);            show.setText(s);            progressDialog.dismiss();        }        @Override        protected void onPreExecute() {            super.onPreExecute();            progressDialog = new ProgressDialog(mContext);            progressDialog.setTitle("Task");            progressDialog.setMessage("Task running");            progressDialog.setCancelable(false);            progressDialog.setMax(200);            progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);            progressDialog.setIndeterminate(false);            progressDialog.show();        }        @Override        protected void onProgressUpdate(Integer... values) {            super.onProgressUpdate(values);            show.setText("Readed " + values[0] +"Lined");            progressDialog.setProgress(values[0]);        }    }}



1 0
原创粉丝点击