Android中UI線程與子線程的通信

在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="https://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

 

You May Also Like