Android-Android如何避免阻塞主线程

发布于 2016-11-06 02:18:39 字数 0 浏览 1433 评论 4

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

归属感 2017-04-04 23:24:46

android的阻塞处理其实记住几个原则就好了,hanlder 什么的实现线程间通信。记住几点:
1.数据和实现想分离。
2.耗时的操作不要放在UI线程中,因为UI 5S,广播10s就阻塞了,会引发ANR。
3.一切有可能引起阻塞的方法等,如非必要,尽量都用在非UI线程中,用handler做为通信工具。

浮生未歇 2017-03-30 16:53:03

hanlder是典型的耗时处理机制。画图、数据查询、下载都这么用的。千万别在ui线程中处理。有空可以去看看framework层的handler处理机制和looper的消息处理机制。

浮生未歇 2017-02-13 17:59:12

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]);
}
}

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文