Android UI主线程为了保证响应用户的及时性,拒绝在UI主线程中进行连接网络或者读取大型文件等耗时的操作。提供了AsyncTask,创建后台线程进行网络读取等耗时操作。AsyncTask提供了一系列的方法和接口来与主线程进行数据交互,并更新UI界面。
AsyncTask的构造函数有三个模板参数:
1.Params,传递给后台任务的参数类型。
2.Progress,后台计算执行过程中,进步单位(progress units)的类型。(就是后台程序已经执行了百分之几了。)
3.Result, 后台执行返回的结果的类型。
AsyncTask并不总是需要使用上面的全部3种类型。标识不使用的类型很简单,只需要使用Void类型即可。
AsyncTask抽象出后台线程运行的五个状态,分别是:1、准备运行,2、正在后台运行,3、进度更新,4、完成后台任务,5、取消任务,对于这五个阶段,AsyncTask提供了五个回调函数:
1、准备运行:onPreExecute(),该回调函数在任务被执行之后立即由UI线程调用。这个步骤通常用来建立任务,在用户接口(UI)上显示进度条。
2、正在后台运行:doInBackground(Params...),该回调函数由后台线程在onPreExecute()方法执行结束后立即调用。通常在这里执行耗时的后台计算。计算的结果必须由该函数返回,并被传递到onPostExecute()中。在该函数内也可以使用publishProgress(Progress...)来发布一个或多个进度单位 (units of progress)。这些值将会在onProgressUpdate(Progress...)中被发布到UI线程。
3. 进度更新:onProgressUpdate(Progress...),该函数由UI线程在publishProgress(Progress...)方法调用完后被调用。一般用于动态地显示一个进度条。
4. 完成后台任务:onPostExecute(Result),当后台计算结束后调用。后台计算的结果会被作为参数传递给这一函数。
5、取消任务:onCancelled (),在调用AsyncTask的cancel()方法时调用。
以下是一个简单的例程,点击按钮,创建一个后台
AsyncTask线程,读取网络数据,在读取数据完成之后,在AsyncTask的onPostExecute方法执行UI的更新操作。
-
public class MainActivity extends Activity {
-
-
-
private TextView tView;
-
@Override
-
protected void onCreate(Bundle savedInstanceState) {
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.activity_main);
-
-
tView=(TextView) findViewById(R.id.textView1);
-
Button button = (Button) findViewById(R.id.btnSearch);
-
button.setOnClickListener(new View.OnClickListener() {
-
-
@Override
-
public void onClick(View v) {
-
// TODO Auto-generated method stub
-
ReadUrl("");
-
}
-
});
-
-
}
-
-
public void ReadUrl(String url) {
-
new AsyncTask<String, Integer, String>() {
-
-
@Override
-
protected void onPreExecute() {
-
// TODO Auto-generated method stub
-
super.onPreExecute();
-
}
-
-
@Override
-
protected void onPostExecute(String result) {
-
// TODO Auto-generated method stub
-
-
tView.setText(result); //更新UI界面
-
super.onPostExecute(result);
-
}
-
-
@Override
-
protected void onProgressUpdate(Integer... values) {
-
// TODO Auto-generated method stub
-
System.out.println("--------->>"+values[0]);
-
super.onProgressUpdate(values);
-
-
-
}
-
-
@Override
-
protected void onCancelled(String result) {
-
// TODO Auto-generated method stub
-
super.onCancelled(result);
-
}
-
-
@Override
-
protected void onCancelled() {
-
// TODO Auto-generated method stub
-
super.onCancelled();
-
}
-
-
@Override
-
protected String doInBackground(String... params) {
-
-
URL url;
-
try {
-
url = new URL(params[0]);
-
URLConnection urlConnection = url.openConnection();
-
int total=urlConnection.getContentLength();
-
InputStream inStream = urlConnection.getInputStream();
-
InputStreamReader inReader = new InputStreamReader(inStream);
-
BufferedReader bfReader = new BufferedReader(inReader);
-
-
String line;
-
StringBuilder sBuilder = new StringBuilder();
-
while ((line = bfReader.readLine()) != null) {
-
sBuilder.append(line);
-
publishProgress(sBuilder.length()/total);
-
}
-
-
inReader.close();
-
inStream.close();
-
-
// System.out.println(sBuilder);
-
return sBuilder.toString();
-
} catch (MalformedURLException e2) {
-
// TODO Auto-generated catch block
-
e2.printStackTrace();
-
} catch (IOException e1) {
-
// TODO Auto-generated catch block
-
e1.printStackTrace();
-
}
-
return null;
-
}
-
-
}.execute(url);
-
-
}
-
-
}
阅读(2334) | 评论(0) | 转发(0) |