Android中UI线程与子线程的通信

本文介绍了一种在Android应用中实现版本更新检查的方法。通过在后台线程发起HTTP请求获取远程服务器上的最新版本信息,并利用Handler机制将这些信息传递给UI线程进行处理。文章详细展示了如何解析JSON响应及如何在主线程中展示这些更新信息。
摘要由CSDN通过智能技术生成

在UI线程中定义并使用handler消息机制可以有效的帮助与其他线程的通信

private Handler mHandler=new Handler(){
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {
            case SUCCESS_NUMBER:{
               //通过getData函数得到通过消息机制获取到的数据
                Bundle bundle=msg.getData();
                versionName=bundle.getString("versionName");
                versionCode=bundle.getString("versionCode");
                versionDes=bundle.getString("versionDes");
                updatePath=bundle.getString("updatePath");
                //建议得到的数据仅限于handleMessage这个函数中使用,因为线程执行顺序无法预测
                checkVersion();
            }break;
        }
    }
};
new Thread(){
    @Override
    public void run() {
        String path="http://10.25.13.155/update/updateInfo.json";
        try {
            URL url=new URL(path);
            HttpURLConnection connection= (HttpURLConnection) url.openConnection();
            connection.setConnectTimeout(5000);
            connection.setReadTimeout(5000);
            if(connection.getResponseCode()==200){
                InputStream is=connection.getInputStream();
                String info= StreamUtil.getInfo(is);
                if(info!=null){
                    Message message= Message.obtain();
                    //Bundle 相当于Map,用来存储键值对
                    Bundle bundle=new Bundle();
                    JSONObject jsonObject=new JSONObject(info);
                    versionName = jsonObject.getString("versionName");
                    versionCode = jsonObject.getString("versionCode");
                    versionDes = jsonObject.getString("versionDes");
                    updatePath = jsonObject.getString("updatePath");
                    bundle.putString("versionName",versionName);
                    bundle.putString("versionCode",versionCode);
                    bundle.putString("versionDes",versionDes);
                    bundle.putString("updatePath",updatePath);
                    message.setData(bundle);
                    message.what=SUCCESS_NUMBER;
                    //延时跳转
                    long endTime=SystemClock.currentThreadTimeMillis();
                    if((endTime-startTime)<5000){
                        SystemClock.sleep(5000-(endTime-startTime));
                    }
                   //将信息通过消息机制传送到UI线程
                    mHandler.sendMessage(message);
                }else{
                    Log.i("联网失败","未获得信息");
                }
            }else{
                Log.i("联网信息","未取得链接");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}.start();
private void checkVersion(){
    if(mLocalVersionCode<Integer.parseInt(versionCode)){
        Log.i("比较成功是否更新",""+versionCode);
    }else {
        Intent intent=new Intent(this,IndexActivity.class);
        startActivity(intent);
        finish();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值