当前位置:编程学习 > wap >>

当主线程去访问一个静态类的方法,而刚好这个方法是要从网络上取得返回值的,这时会报错。那这个静态类方法里面应该如何来写呢?万分感谢


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
            }
        }
    };
--------------------编程问答--------------------
引用 5 楼 tantahe 的回复:
怎么改也不能再主线程做网络操作。
获取到version以后,不是要return,是要发个消息,然后用handler处理这个消息:弹出提示啊什么的都随便你做了。

---------------------------
楼上的方法我会,但问题是本来我这里只是一个简单的方法返回一个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()); 
--------------------编程问答-------------------- 记得还要配置上网权限。 --------------------编程问答--------------------
引用 7 楼 javamy028 的回复:
Quote: 引用 5 楼 tantahe 的回复:

怎么改也不能再主线程做网络操作。
获取到version以后,不是要return,是要发个消息,然后用handler处理这个消息:弹出提示啊什么的都随便你做了。

---------------------------
楼上的方法我会,但问题是本来我这里只是一个简单的方法返回一个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来等待返回,但这样又会改成应用崩溃

一个简单的业务,就没有简单点的办法了吗?

简单是简单  但是网络出了问题你就后悔吧  anr妥妥的
补充:移动开发 ,  Android
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,