android的阻塞处理其实记住几个原则就好了,hanlder 什么的实现线程间通信。记住几点:1.数据和实现想分离。2.耗时的操作不要放在UI线程中,因为UI 5S,广播10s就阻塞了,会引发ANR。3.一切有可能引起阻塞的方法等,如非必要,尽量都用在非UI线程中,用handler做为通信工具。
hanlder是典型的耗时处理机制。画图、数据查询、下载都这么用的。千万别在ui线程中处理。有空可以去看看framework层的handler处理机制和looper的消息处理机制。
Android的Handler和AsyncTask,可以避免阻塞主线程(UI线程),且UI的更新只能在主线程中完成,因此异步处理是不可避免的。
AsyncTask,它使创建需要与用户界面交互的长时间运行的任务变得更简单。不需要借助线程和Handler即可实现。
获取网页的例子:
import java.io.ByteArrayOutputStream;import java.io.InputStream;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.os.AsyncTask;//设置三种类型参数分别为String,Integer,Stringclass PageTask extends AsyncTask<String, Integer, String> {// 可变长的输入参数,与AsyncTask.exucute()对应protected String doInBackground(String... params) {try {HttpClient client = new DefaultHttpClient();// params[0] 代表连接的urlHttpGet 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));}// 为了在模拟器中清楚地看到进度,让线程休眠100msThread.sleep(100);}s = new String(baos.toByteArray());}// 返回结果return s;
} catch (Exception e) {e.printStackTrace();}return null;}protected void onCancelled() {super.onCancelled();}
protected void onPostExecute(String result) {// 返回HTML页面的内容message.setText(result);}
protected void onPreExecute() {// 任务启动,可以在这里显示一个对话框,这里简单处理message.setText(R.string.task_started);}
protected void onProgressUpdate(Integer... values) {// 更新进度message.setText(values[0]);}}
http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html
仔细阅读喔
中文版:http://www.cnblogs.com/over140/archive/2011/09/12/2173951.html
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
暂无简介
文章 0 评论 0
接受
发布评论
评论(4)
android的阻塞处理其实记住几个原则就好了,hanlder 什么的实现线程间通信。记住几点:
1.数据和实现想分离。
2.耗时的操作不要放在UI线程中,因为UI 5S,广播10s就阻塞了,会引发ANR。
3.一切有可能引起阻塞的方法等,如非必要,尽量都用在非UI线程中,用handler做为通信工具。
hanlder是典型的耗时处理机制。画图、数据查询、下载都这么用的。千万别在ui线程中处理。有空可以去看看framework层的handler处理机制和looper的消息处理机制。
Android的Handler和AsyncTask,可以避免阻塞主线程(UI线程),且UI的更新只能在主线程中完成,因此异步处理是不可避免的。
AsyncTask,它使创建需要与用户界面交互的长时间运行的任务变得更简单。不需要借助线程和Handler即可实现。
获取网页的例子:
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
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.os.AsyncTask;
//设置三种类型参数分别为String,Integer,String
class PageTask extends AsyncTask<String, Integer, String> {
// 可变长的输入参数,与AsyncTask.exucute()对应
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;
}
protected void onCancelled() {
super.onCancelled();
}
protected void onPostExecute(String result) {
// 返回HTML页面的内容
message.setText(result);
}
protected void onPreExecute() {
// 任务启动,可以在这里显示一个对话框,这里简单处理
message.setText(R.string.task_started);
}
protected void onProgressUpdate(Integer... values) {
// 更新进度
message.setText(values[0]);
}
}
http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html
仔细阅读喔
中文版:
http://www.cnblogs.com/over140/archive/2011/09/12/2173951.html