AsyncTask是一个抽象类,在继承时指定三个泛型的参数,
1 Params 在后台任务中执行
2 Progress 如果需要在界面上显示当前的进度,则这里使用指定的泛型
作为进度单位
3 当任务执行完毕后,需要对结果进行返回,则这里使用指定的泛型作为返回值类型
方法的介绍
1 onPreExecute();
会在后台任务开始执行前调用,用于进行一些界面上的初始化操作,比如显示进度条
2 doInBackground(Params)
这个方法中个所以代码都会在子线程中运行,在这里进行耗时操作。任务完成后可以用return语句返回执行的结果,如果第三个泛型参数指定的是 Void,不返回执行结果。这个方法内不能不可以进行UI操作如果要更新UI元素,调用publisProgress(Progress)方法来执行。
3 onProgressUpdate(Progress)
当在后台任务调用了punlishProgress(Progress)方法后,这个方法很快会被调用,方法中携带的参数就是后台任务中传递过来的。在这个方法里可以进行UI操作,利用参数中的数值就可以对界面元素进行相应地更新
4 onPostExecute(Result) 后台任务执行完毕通过return语句进行返回,这个方法很快被调用。返回的数据会作为参数传递到此方法中,可以利用返回的数据进行一些UI操作,比如提醒任务的执行结果。以及关闭进度条对话等。
总结:
doInBackground()中执行耗时操作,onPressUpdate()方法中进行UI操作,在onPostExecute()方法中执行任务的收尾工作。
应用的实例:
package com.example.usingasynctask;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
public class MainActivity extends AppCompatActivity {
TextView textView ;
Button button ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView =(TextView) findViewById(R.id.textView);
button =(Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ReadURL("http://www.baidu.com");
}
});
}
public void ReadURL(String url){
new AsyncTask<String , Void ,String>(){
@Override
protected String doInBackground(String...params) {
//Java多参数方法,就是说在不清楚参数应该放多少情况下,只写一个方法就能实现。
try {
URL url = new URL(params[0]);
URLConnection connection = url.openConnection();
InputStream isStream = connection.getInputStream();
InputStreamReader isr = new InputStreamReader(isStream);
BufferedReader br = new BufferedReader(isr);
String line;
StringBuilder builder = new StringBuilder();
while ((line = br.readLine()) != null ){
builder.append(line);
}
br.close();
isStream.close();
return builder.toString();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e){
e.printStackTrace();
}
return null;
}
@Override
protected void onPreExecute() {
Toast.makeText(MainActivity.this,"开始读取",Toast.LENGTH_SHORT);
super.onPreExecute();
}
@Override
protected void onPostExecute(String s) {
textView.setText(s);
super.onPostExecute(s);
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
@Override
protected void onCancelled(String s) {
super.onCancelled(s);
}
@Override
protected void onCancelled() {
super.onCancelled();
}
}.execute(url);
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="vertical">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button"
android:id="@+id/button"/>
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
android:id="@+id/textView" />
</ScrollView>
</LinearLayout>
<uses-permission android:name="android.permission.INTERNET"/>
URLConnection connection = url.openConnection();
InputStream isStream = connection.getInputStream();
InputStreamReader isr = new InputStreamReader(isStream);
BufferedReader br = new BufferedReader(isr);