AsyncTask(异步任务)的用法
【摘要】
在开发Android应用时必须遵守单线程模型的原则: Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。在单线程模型中始终要记住两条法则:
1. 不要阻塞UI线程
2. 确保只在UI线程中访问Android UI工具包
当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thr...
doInBackground方法和onPostExecute的参数必须对应,这两个参数在AsyncTask声明的泛型参数列表中指定,第一个为doInBackground接受的参数,第二个为显示进度的参数,第第三个为doInBackground返回和onPostExecute传入的参数。
从网上获取一个网页,在一个TextView中将其源代码显示出来
-
package test.list;
-
import java.io.ByteArrayOutputStream;
-
import java.io.InputStream;
-
import java.util.ArrayList;
-
-
import org.apache.http.HttpEntity;
-
import org.apache.http.HttpResponse;
-
import org.apache.http.client.HttpClient;
-
import org.apache.http.client.methods.HttpGet;
-
import org.apache.http.impl.client.DefaultHttpClient;
-
-
import android.app.Activity;
-
import android.app.ProgressDialog;
-
import android.content.Context;
-
import android.content.DialogInterface;
-
import android.os.AsyncTask;
-
import android.os.Bundle;
-
import android.os.Handler;
-
import android.os.Message;
-
import android.view.View;
-
import android.widget.Button;
-
import android.widget.EditText;
-
import android.widget.TextView;
-
-
public class NetworkActivity extends Activity{
-
private TextView message;
-
private Button open;
-
private EditText url;
-
-
@Override
-
public void onCreate(Bundle savedInstanceState) {
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.network);
-
message= (TextView) findViewById(R.id.message);
-
url= (EditText) findViewById(R.id.url);
-
open= (Button) findViewById(R.id.open);
-
open.setOnClickListener(new View.OnClickListener() {
-
public void onClick(View arg0) {
-
connect();
-
}
-
});
-
-
}
-
-
private void connect() {
-
PageTask task = new PageTask(this);
-
task.execute(url.getText().toString());
-
}
-
-
-
class PageTask extends AsyncTask<String, Integer, String> {
-
// 可变长的输入参数,与AsyncTask.exucute()对应
-
ProgressDialog pdialog;
-
public PageTask(Context context){
-
pdialog = new ProgressDialog(context, 0);
-
pdialog.setButton("cancel", new DialogInterface.OnClickListener() {
-
public void onClick(DialogInterface dialog, int i) {
-
dialog.cancel();
-
}
-
});
-
pdialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
-
public void onCancel(DialogInterface dialog) {
-
finish();
-
}
-
});
-
pdialog.setCancelable(true);
-
pdialog.setMax(100);
-
pdialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
-
pdialog.show();
-
-
-
}
-
@Override
-
protected String doInBackground(String... params) {
-
-
try{
-
-
HttpClient client = new DefaultHttpClient();
-
// params[0]代表连接的url
-
HttpGet get = new HttpGet(params[0]);
-
HttpResponse response = client.execute(get);
-
HttpEntity entity = response.getEntity();
-
long length = entity.getContentLength();
-
InputStream is = entity.getContent();
-
String s = null;
-
if(is != null) {
-
ByteArrayOutputStream baos = new ByteArrayOutputStream();
-
-
byte[] buf = new byte[128];
-
-
int ch = -1;
-
-
int count = 0;
-
-
while((ch = is.read(buf)) != -1) {
-
-
baos.write(buf, 0, ch);
-
-
count += ch;
-
-
if(length > 0) {
-
// 如果知道响应的长度,调用publishProgress()更新进度
-
publishProgress((int) ((count / (float) length) * 100));
-
}
-
-
// 让线程休眠100ms
-
Thread.sleep(100);
-
}
-
s = new String(baos.toByteArray()); }
-
// 返回结果
-
return s;
-
} catch(Exception e) {
-
e.printStackTrace();
-
-
}
-
-
return null;
-
-
}
-
-
@Override
-
protected void onCancelled() {
-
super.onCancelled();
-
}
-
-
@Override
-
protected void onPostExecute(String result) {
-
// 返回HTML页面的内容
-
message.setText(result);
-
pdialog.dismiss();
-
}
-
-
@Override
-
protected void onPreExecute() {
-
// 任务启动,可以在这里显示一个对话框,这里简单处理
-
message.setText(R.string.task_started);
-
}
-
-
@Override
-
protected void onProgressUpdate(Integer... values) {
-
// 更新进度
-
System.out.println(""+values[0]);
-
message.setText(""+values[0]);
-
pdialog.setProgress(values[0]);
-
}
-
-
}
-
-
}
文章来源: panda1234lee.blog.csdn.net,作者:panda1234lee,版权归原作者所有,如需转载,请联系作者。
原文链接:panda1234lee.blog.csdn.net/article/details/8673783
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)