安卓主线程不允许访问网络,子线程不允许更新UI,但Android提供一些好用的异步加载的工具。AsyncTask就是其中之一。
AsyncTask背后原理是基于异步消息处理机制的。
AsyncTask是一个抽象类想要使用它必须先创建子类继承他,在继承时要指定三个泛型参数:
-
Params
在执行任务时需要穿入的参数,可在任务中使用。 -
Progress
后台执行任务时的进度单位。 -
Result
如果任务完成后需要对结果进行返回,则使用这里的泛型作为返回值类型。
如不需要可为Void
。
示例代码:
package xyz.liut.asynctasktest;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
public class MainActivity extends AppCompatActivity {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv_main);
new MyAsyncTask().execute("http://www.liut.xyz");
}
private class MyAsyncTask extends AsyncTask{
@Override
protected void onPreExecute() {
//任务执行之前调用此处代码
super.onPreExecute();
}
@Override
protected String doInBackground(String... params) {
//任务内容,此处为子线程。在此方法内主动调用publishProgress(Void... values)就会自动调用onProgressUpdate(Void... values);
//此方法必须实现。
try {
InputStream is = new URL(params[0]).openStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String result = "";
String line = "";
while ((line = br.readLine())!=null){
result += line;
}
Log.d("tag",result);
return result;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onProgressUpdate(Void... values) {
//后台任务中调用publishProgress();这个方法就会被调用。
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(String s) {
//当后台任务执行完毕并通过return语句进行返回时调用此方法,返回的内容会作为参数传递到此方法。可以根据返回的内容进一步操作。此处可以更新UI。
tv.setText(s);
}
}
}
网友评论