b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

Android 的单线程模型或者 UI 线程问题记录 · TesterHome

电脑杂谈  发布时间:2020-03-03 06:03:46  来源:网络整理

android单线程模型_android 线程_android进程和线程的区别

Andoid UI toolkit并不是线程安全的,所以你不能从非UI线程来操纵UI组件。你需要把所有的UI操作放在UI线程里,所以Android的单线程模型有两条原则:

1.不要阻塞UI线程。

2.不要在UI线程之外访问Android UI toolkit(主要是这两个包中的模块:android.widget and android.view)。

android单线程模型_android 线程_android进程和线程的区别

那我之前写的一个demo中,在UI线程中我需要发起一个网络请求并解析响应的结果,调试几次发现,每次到达发送http请求时才会抛出异常。。

谷歌了一大把,终于看到本文最前面讲的东西。在安卓4.0以后引入了严格模式android单线程模型,造成这种的出错原因是代码不符合Android规范,如果把后面访问方法改为异步操作就不会出现在4.0上访问出现 android.os.NetworkOnMainThreadException异常

方法一:

android进程和线程的区别_android单线程模型_android 线程

那么为了保留这个项目并能运行,我们可以在oncreate方法的一开始就添加如下代码:

    //严苛模式(StrictMode)
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() //构造StrictMode
.detectDiskReads() //当发生磁盘读操作时输出
.detectDiskWrites()//当发生磁盘写操作时输出
.detectNetwork() //访问网络时输出,这里可以替换为detectAll() 就包括了磁盘读写和网络I/O
.penaltyLog() //以日志的方式输出
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects() //探测SQLite操作
.penaltyLog() //以日志的方式输出
.penaltyDeath()
.build());

方法二:

android 线程_android进程和线程的区别_android单线程模型

或者

“只有在UI线程中的对象能够操作UI线程中的对象,为了将非UI线程中的数据传送到UI线程android单线程模型,可以使用一个 Handler运行在UI线程中。Handler是Android framework中管理线程的个别,一个Handler对象负责接收消息之后处理消息。”

我可以为一个新的线程建立一个Handler,也可以建立一个Handler然后将它和已有线程连接。

android 线程_android进程和线程的区别_android单线程模型

代码如下:

//获取网络资源..采用handler+Thread模式实现多线程异步加载
private void loadContent(){
Thread thread = new Thread(){
@Override
public void run(){
//载入xml文件
try {
//先得到文章信息
title = analyzeXML(i);//analyzeXML()为我一个自定义方法,返回一个String
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 模拟网络延时
SystemClock.sleep(2000);
Message msg = new Message();
//将title通过sendMessage方法发送到handler中
msg.obj = title;
myHandler.sendMessage(msg);
}
};
thread.start();
}
    //更新UI
private Handler myHandler = new Handler(){
@SuppressWarnings("unused")
public void handlerMessage(Message msg){
//super.handleMessage(msg);
//取得其他线程发送过来的Message对象
//设置textview控件的值
textview.setText("第"+(i+1)+"篇文章标题是:"+msg.obj);
}
};

搞定!

另外注明,本人乃刚入手学习安卓,不对之处请大家多多指教~~~


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-142814-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...