android4.0以上访问网络不能在主线程中进行以及在线程中操作UI的解决方法
MONO 调用一个线程操作UI 然后报Only the original thread that created a view hierarchy can touch its views。错误 google了一下说UI的操作还是需要到主线程,看了些java的例子 java中是使用了Handler 但是在MONO中需要怎么实现?
一.
RunOnUiThread(()=>执行语句 );
demo:
this.RunOnUiThread(() => tv.Text = "records: " + twt.Count.ToString());
二.
Handler实现也是可以的,关键代码
private Handler handler = new Handler();
Java.Lang.Runnable rb;
protected override void OnCreate(Bundle bundle){
rb = new Java.Lang.Runnable(() => {
button.Text = string.Format("{0} Runnable!", count++);
handler.PostDelayed(rb, 1000);
});
handler.PostDelayed(rb, 1000);}
三.其他方式
刚刚上手android,在写一个利用Socket与服务器端进行通信的Demo时候报了一个android.os.NetworkOnMainThreadException的异常:
服务器端:
public class SimpleServer {
public static void main(String[] args){
try {
ServerSocket ss=new ServerSocket(40000);
System.out.println("等待连接......");
while(true){
Socket s=ss.accept();
OutputStream os=s.getOutputStream();
os.write("hello".getBytes("utf-8"));
os.close();
s.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
求助度娘后发现是SDK的版本问题,android4.0中访问网络不能在主程序中进行,行吧,那就老老实实的重新开启一个线程:
new Thread(){
public void run(){
try {
Socket s=new Socket("172.22.16.26", 40000);
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
String line=br.readLine();
show.setText("服务器说:"+line);
br.close();
s.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}.start();
结果又报了异常:
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
相信各位已经看出了在下犯了一个很低级的错误:在新启的线程中操作UI,UI线程是非线程安全的,Android平台不允许Activity新启动的线程访问该Activity里的界面组件,这时就要借助Handler的消息传递机制了:
new Thread(){
public void run(){
try {
Socket s=new Socket("172.18.6.26",40000);
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
String line=br.readLine();
//System.out.println("服务器说:"+line);
Message msg=new Message();
msg.what=0x123;
msg.obj=line;
myhandler.sendMessage(msg);
br.close();
s.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}.start();
然后重写handlerMessage方法获取消息:
final Handler myhandler=new Handler(){
public void handleMessage(Message msg){
if(msg.what==0x123){
System.out.println("--------------->"+msg.obj);
show2.setText((String)msg.obj);
}
}
};
当新线程发送消息时,该方法自动被调用,handlerMessage(Message msg)方法依旧位于主线程中,所以可以动态的修改UI组件。
网络连接不能放在主线程
android 4.0 以上 网络连接不能放在主线程
4.0 以下 好像可以
在Android4.0以后,会发现,只要是写在主线程(就是Activity)中的HTTP请求,运行时都会报错,这是因为Android在4.0以后为了防止应用的ANR(aplication Not Response)异常,即使这里表达不是很清晰,大家应该都明白吧,哈哈
就针对此问题有两种解决的方法:
1.可以再Activity的onCreate()方法中加入这样一段代码,如下:
JAVA
if (Build.VERSION.SDK_INT >= 11) {
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads ().detectDiskWrites().detectNetwork().penaltyLog().build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());
}
Mono 版
if (Build.VERSION.SdkInt.GetHashCode()>=11)
{
StrictMode.SetThreadPolicy(new StrictMode.ThreadPolicy.Builder().DetectDiskReads().DetectDiskWrites().DetectNetwork().PenaltyLog().Build());
StrictMode.SetVmPolicy(new StrictMode.VmPolicy.Builder().DetectLeakedSqlLiteObjects().DetectLeakedClosableObjects().PenaltyLog().PenaltyDeath().Build());
}
后就可以在主线程中进行网络操作了
2.一般情况我们应该这样做
启动一条子线程进行你的网络请求。
当然,如果你的应用程序执行的网络请求数据量很小的话,可以使用第一种方案
android4.0以上访问网络不能在主线程中进行以及在线程中操作UI的解决方法的更多相关文章
- 03_主线程联网问题&ANR&子线程不能修改UI
如果不使用HAXM,恐怕网页源码查看器无法获取servlet的源码.初步猜测是安卓模拟器运行速度太慢了.如果CPU不支持VT-x的话,HAXM是安装不上的.所以可以先开启VT-x. 可以参考几篇文章h ...
- android.os.NetworkOnMainThreadException 在4.0之后谷歌强制要求连接网络不能在主线程进行访问
谷歌在4.0系统以后就禁止在主线程中进行网络访问了,原因是: 主线程是负责UI的响应,如果在主线程进行网络访问,超过5秒的话就会引发强制关闭, 所以这种耗时的操作不能放在主线程里.放在子线程里,而子线 ...
- 有主线程发送message给子线程
通常我们在处理耗时任务时候都会通过新建线程来处理,当任务处理完后通过Handler将结果发送回主线程.比如下面示例: package com.example.testlistener; import ...
- 关于Quartus II 13.0对应开发NIOS II软件程序时报错Symbol 'NULL' could not be resolved问题的解决方法
关于Quartus II 13.0对应开发NIOS II软件程序时报错Symbol 'NULL' could not be resolved问题的解决方法 近期在评估使用NIOS II处理器进行项目的 ...
- 新安装 wampserver 出现 You don't have permission to access / on this server. 或者访问数据库出现You don't have permission to access /phpmyadmin/ on this server.(解决方法)转
本地搭建wamp,输入http://127.0.0.1访问正常,当输入http://localhost/,apache出现You don't have permission to access/on ...
- Ubuntu访问window下的磁盘分区出现“Error mounting /dev/sda5 at/media”错误的解决方法
我装ubuntu之前,电脑上安装了windows 10,为了装ubuntu,在window 10下的磁盘工具分配了30G的磁盘空间.安装完Ubuntu之后,访问window 10的磁盘分区出现“Err ...
- mono 3.4.0 make install的时候出现"找不到 Microsoft.Portable.Common.targets 文件”的错误提示解决方法
如果在这时就进行配置安装Mono的话,会在make阶段得到一个“找不到 Microsoft.Portable.Common.targets 文件”的错误提示, 所以需要先进行如下处理: #> c ...
- 安卓开发解决android.os.NetworkOnMainThreadException异常方法(主线程不能直接调用webservice)
安卓开发解决android.os.NetworkOnMainThreadException异常方法 2013-01-07 14:01:04| 分类: 技术 | 标签:安卓 技术 java | ...
- [置顶] 使用严苛模式打破Android4.0以上平台应用中UI主线程的“独断专行”
传送门 ☞ 轮子的专栏 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229 已经有好一段时间没有关注Android应用方面的事情了:)最近单位来了一个Androi ...
随机推荐
- Android文件上传
服务端: using System; using System.Collections.Generic; using System.Linq; using System.Web; using Syst ...
- HDU 3157 Crazy Circuits (有源汇上下界最小流)
题意:一个电路板,上面有N个接线柱(标号1~N) 还有两个电源接线柱 + - 然后是 给出M个部件正负极的接线柱和最小电流,求一个可以让所有部件正常工作的总电流. 析:这是一个有源汇有上下界的 ...
- FPGA时序约束和timequest timing analyzer
FPGA时序约束 时钟约束 #************************************************************** # Create Clock #****** ...
- PHP性能分析工具:xhprof
phpize的安装 一直想装VLD却一直没装上,因为需要用到phpize,但这个工具大部分机子都没有装,上网搜了一下大部分都是讲phpize的应用没有讲怎么安装. 今天终于搜到了,不过是要在li ...
- 记在WEBAPI中AutoMapper的初使用方法
很早就听说AutoMapper了.这些天一直在写api接口,发现之前的类型转换有点问题,就想到了用AutoMapper.用作DTO转换工具. 废话不多说,直接开些代码 首先 在Vs中找到 工具--- ...
- 一键部署react到nginx上
仅用于记录自己的程序部署 cd /home/web; rm -rf JulyNovelReact; mkdir JulyNovelReact; cd JulyNovelReact; rz; tar - ...
- js 倒计时,转义
function leftTimer(time) { var leftTime = (new Date(time)) - (new Date()); //计算剩余的毫秒数 var days = par ...
- c#设计模式之装饰器模式(Decorator Pattern)
引子 在面向对象语言中,我们常常会听到这样一句话:组合优于继承.那么该如何去理解这句话呢? 下面我将以游戏装备为模型用简单的代码去展示它 先创建一个装备的抽象类,然后创建刀枪2个具体的业务子类 pub ...
- Cesium Language (CZML) 入门2 — CZML Content(CZML的内容)
原文:https://github.com/AnalyticalGraphicsInc/cesium/wiki/CZML-Content 以下是描述CZML文档或者流中可能存在的内容.要解释CZML文 ...
- 【VS2015】故障修复之dep6100,dep6200
问题描述:把uwp程序往手机上(或者往模拟器上)部署时,vs ide提示我错误信息dep6100和dep6200,报告说“连接不到设备”. 这可把我愁坏了,各种方法都不行,最后发现问题出在Hyper- ...