您的位置:首页 > 移动开发 > Android开发

Android 讲解:AsyncTask

2016-01-22 14:14 495 查看
AsyncTask
是一个类,作用和
Hanlder
一样,都是Android 中异步代码执行。相比
Hanlder
AsyncTask
Hanlder
代码清晰,容易理解,前提是你已经熟练掌握
AsyncTask


这里用一个模拟下载程序来使用AsyncTask 。

代码实例

main_Activity.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="cn.met0.android.asycntask.MainActivity" >

<ProgressBar
android:id="@+id/progressbar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
/>

</RelativeLayout>


这个布局文件比较简单,就是一个进度条,用来显示下载进度。

DownAsyncTask.java

public class DownAsyncTask extends AsyncTask<Void, Integer, Boolean> {

private ProgressBar progressBar;
private Context context;

public  DownAsyncTask(ProgressBar progressBar,Context context) {
this.progressBar = progressBar;
this.context = context;
}

@Override
protected void onPreExecute() {

}

@Override
protected Boolean doInBackground(Void... params) {

int i = 1;
while(i++ != 50){
try {
Thread.sleep(100);
publishProgress(i * 100 / 50);
} catch (InterruptedException e) {
return false;
}
}

return true;
}

@Override
protected void onProgressUpdate(Integer... values) {
int progress = values[0];
progressBar.setProgress(progress);
}

@Override
protected void onPostExecute(Boolean result) {
if(result){
Toast.makeText(context, "download success!!", Toast.LENGTH_LONG).show();
}else{
Toast.makeText(context, "download fail!!", Toast.LENGTH_LONG).show();
}
}

}


下面一点一点解析这个类。

public class DownAsyncTask extends AsyncTask<Void, Integer, Boolean>{}


这个一个继承
AsyncTask
的一个类。

有3个泛型

第一个Void, 是其他类启动
DownAsyncTask
时传的参数类型。

第二个Integer ,这个一个下载程序,用Integer 代表下载的进度的类型。

第三个Boolean,这个是当执行完成后,返回的结果的类型。

可能以上的几个泛型还不是太理解,下面看看介绍函数的时候就明白了。

private ProgressBar progressBar;
用来显示下载的进度

private Context context;
在这个类中,作用只有一个,就是用来看到最后下载是否成功,用来做
Toast
的参数。

public  DownAsyncTask(ProgressBar progressBar,Context context)
这个构造函数是用来初始化
progressBar
context
的。

protected void onPreExecute()
是启动后台任务时执行的方法,主要用于界面的初始化,如加载一个下载进度条(这里我们进度条直接显示,无需加载,所有什么代码也没写)。

doInBackground(Void... params)
后台任务的代码就在这里面编写,这个函数模拟了一个下载程序,当下载一点后,执行
publishProgress(Integer... progress)
函数,参数progress 就是下载的进度。这里面不能直接操作UI 控件。

onProgressUpdate(Integer... progress)
用作UI 更新,当
doInBackground(Void... params)
函数执行了
publishProgress(Integer... progress)
函数,则会间接的执行这个函数。

protected void onPostExecute(Boolean result)
当后台任务函数执行完成后,则会返回一个返回值,AsyncTask 会调用这个函数并且把然会在传入进来。

MainActivity.java

public class MainActivity extends Activity {

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

ProgressBar progressBar = (ProgressBar) findViewById(R.id.progressbar);

new DownAsyncTask(progressBar,this).execute();

}

}


new DownAsyncTask(progressBar,this).execute();
启动下载后台任务。

运行一下



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android