public static NetHelper
{
    public static getVersion()
    {
        int version = getNetVersion();//这里从网络上取得网上的版本
    }
}
上面的类在线程中调用是没有问题的,但在主线程调用就会出错
因为这个GetVersion是要访问网络的
Android4.0 以后不允许在主线程进行网络连接,否则会出现 android.os.NetworkOnMainThreadException那在不更改主线程业务的情况下,
如何修改这个GetVersion方法,让他可以在主线程,也可以在子线程中调用呢?万分感谢

解决方案 »

  1.   

    new Thread  +  handler
      

  2.   

    new Thread  +  handler 
    ----------------------------
    这些我会
    问题是如果我用了new Thread  +  handler 的话
    我的
    publi static int GetNetVersion()
    {
        new Thread(new Runable(){ ... }).start();
        return ??? 这样的话我这个方法就没有办法返回啊
    }
    谢谢
      

  3.   

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

  4.   

                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.   

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

  6.   

    很简单,在官网上有详解,在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.   

    ---------------------------
    楼上的方法我会,但问题是本来我这里只是一个简单的方法返回一个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妥妥的