Android AsyncTask
来源:互联网 发布:php微信扫码支付 编辑:程序博客网 时间:2024/05/12 06:39
在Android开发中必须遵守单线程模型的原则:Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。Android开发的两条准则:
1、不要阻塞UI线程
2、确保只在UI线程中访问Android UI工具包
android规定:
1、主线程不能做耗时操作(阻塞UI线程5s以上会报ANR)
2、主线程不能做联网操作(android4.0之后的规定)
3、子线程不能直接更新UI
当一个程序第一次启动时,Android同时开启UI线程(Main Thread),Main Thread主要负责处理与UI相关的事件,例如:用户按键时间,用户触摸屏幕事件等,并把相关的事件分发到对应的组组件进行处理。
对于一些耗时的操作,比如:从网上下载图片,数据库的访问等,一般需要开启一个线程完成,获得结果之后,不能直接在子线程中调用改变界面的方法(例如:Text
View1..setText()),因为除了UI线程,其他线程不能直接访问UI线程成员,否则会报:android.view.ViewRoot$CalledFromWrongThreadException:Only the Original thread that created a view hierarchy can touch its views.
针对此,Android提供了几种在其他线程与UI线程通信的方法:
Activity.runOnUiThread(Runable);
View.post(Runable);
View.postDelaed(Runable,long);
Handler(另起一个Handler,将改变UI的代码封装,子线程调用此Handler,完成工作之后发送一个消息到消息队列中,主线程在空闲的时候更新UI状态(大部分时间是即时的))
这些类和方法会使你的代码很复杂,当你需要实现一些很复杂的操作并需要频繁的更新UI时,变得很糟糕。
为了解决这个问题,Android1.5提供了一个工具类:AsyncTask,它使穿件需要与UI界面交互的长时间与你系那个的任务变得更简单。不需要直接借助线程和Handler即可实现。
相对于线程+Handler来说,AsyncTask对于简单任务的处理更安全,其内部实现方法使用了Android的Handler机制。
AsyncTask介绍
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 // params[0]代表AsyncTask.execute方法传的第一个参数 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]); } } }
从网上获取一个网页,在一个TextView中将其源代码显示出来:
- Android asyncTask
- Android AsyncTask
- Android AsyncTask
- Android AsyncTask
- Android AsyncTask
- Android AsyncTask
- Android asyncTask .
- Android AsyncTask
- Android AsyncTask
- Android AsyncTask
- Android AsyncTask
- Android AsyncTask
- Android AsyncTask
- Android AsyncTask !!!!
- Android AsyncTask
- Android AsyncTask
- Android AsyncTask
- Android AsyncTask
- Failed to allocate a 76 byte allocation with 0 free bytes and 0B until OOM
- Linux中/proc/meminfo查看内存信息,对输出结果的简单说明
- King's Order hdu 5642
- 总结
- 【OpenCV】直方图——二维
- Android AsyncTask
- 对话框消息WM_INITDIALOG
- Jquery中的Ajax操作
- 如何快速的开发一个完整的iOS直播app
- win32之对话框
- codevs 1697 ⑨要写信
- 字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”
- Struts最基础的项目搭建与配置
- DestroyWindow的作用