当主线程去访问一个静态类的方法,而刚好这个方法是要从网络上取得返回值的,这时会报错。那这个静态类方法里面应该如何来写呢?万分感谢
public static NetHelper
{
public static getVersion()
{
int version = getNetVersion();//这里从网络上取得网上的版本
}
}
上面的类在线程中调用是没有问题的,但在主线程调用就会出错
因为这个GetVersion是要访问网络的
Android4.0 以后不允许在主线程进行网络连接,否则会出现 android.os.NetworkOnMainThreadException
那在不更改主线程业务的情况下,
如何修改这个GetVersion方法,让他可以在主线程,也可以在子线程中调用呢?
万分感谢
--------------------编程问答-------------------- Handler用过没? --------------------编程问答-------------------- 线程线程线程 --------------------编程问答-------------------- new Thread + handler --------------------编程问答-------------------- new Thread + handler
----------------------------
这些我会
问题是如果我用了new Thread + handler 的话
我的
publi static int GetNetVersion()
{
new Thread(new Runable(){ ... }).start();
return ??? 这样的话我这个方法就没有办法返回啊
}
谢谢 --------------------编程问答-------------------- 怎么改也不能再主线程做网络操作。
获取到version以后,不是要return,是要发个消息,然后用handler处理这个消息:弹出提示啊什么的都随便你做了。 --------------------编程问答--------------------
new Thread() {
@Override
public void run() {
super.run();
NetHelper.getVersion();
Message message = new Message();
Bundle bundle = new Bundle();// 存放数据
message.setData(bundle);
message.what = 0;
handler.sendMessage(message);
}
}.start();
private Handler handler = new Handler() {--------------------编程问答--------------------
@Override
public void handleMessage(Message msg) {
if (msg.what == 0) {
//do something
}
}
};
---------------------------
楼上的方法我会,但问题是本来我这里只是一个简单的方法返回一个int数值
就得用Handle来发消息处理,本来很简单的业务逻辑如
如主线程取得网络版本号:int version = NetHelper.GetNetVersion();
现在就得把在NetHelper里面做Thread + Handle
然后,还得在NetHelper加个监听
在调用的地方还得写个回调如:
NetHelper helper = new NetHelper();
helper.setOnVersionResult = new setOnVersionResult(){
public void Result(int netVersion)
{
...在这里在进行backback 播放
}
}
-------------------------
这样不是好麻烦啊
本来我想的办法是用Countdownlatch来等待返回,但这样又会改成应用崩溃
一个简单的业务,就没有简单点的办法了吗? --------------------编程问答-------------------- 很简单,在官网上有详解,在oncreat的方法里面加如下代码:
@Override--------------------编程问答-------------------- 记得还要配置上网权限。 --------------------编程问答--------------------
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.logins);//就是将下面的代码加入到里面,activity主线程就可以访问网络了。
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork() // or .detectAll() for all detectable problems
.penaltyLog()
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects()
.penaltyLog()
.penaltyDeath()
.build());
简单是简单 但是网络出了问题你就后悔吧 anr妥妥的
补充:移动开发 , Android