Android 手機衛士--解析json與訊息機制發送不同類型訊息,androidjson

來源:互聯網
上載者:User

Android 手機衛士--解析json與訊息機制發送不同類型訊息,androidjson

本文地址:http://www.cnblogs.com/wuyudong/p/5900800.html,轉載請註明源地址。

1、解析json資料

解析json的代碼很簡單

JSONObject jsonObject = new JSONObject(json);                        //debug調試,解決問題String versionName = jsonObject.getString("versionName");mVersionDes = jsonObject.getString("versionDes");String versionCode = jsonObject.getString("versionCode");mDownloadUrl = jsonObject.getString("downloadUrl");// 日誌列印    Log.i(tag, versionName);Log.i(tag, mVersionDes);Log.i(tag, versionCode);Log.i(tag, mDownloadUrl);
2、使用訊息機制發送不同類型訊息

在擷取伺服器端json資料後,得到app的版本號碼,通過和用戶端的版本號碼進行對比

    //比對版本號碼(伺服器版本號碼>本地版本號碼,提示使用者更新)                        if(mLocalVersionCode < Integer.parseInt(versionCode)) {                            //提示使用者更新,彈出對話方塊(UI),訊息機制                            msg.what = UPDATE_VERSION;                                                    } else {                            //進入應用程式主介面                            msg.what = ENTER_HOME;                        }

可以使用android的訊息機制發送不同類型訊息,可以參考《Android訊息機制入門》

首先建立Handler

    private Handler mHandler = new Handler() {        //        public void handleMessage(android.os.Message msg) {            switch (msg.what) {            case UPDATE_VERSION:                //彈出對話方塊,提示使用者更新                //showUpdateDialog();                break;            case ENTER_HOME:                //進入應用程式主介面,activity跳轉過程                enterHome();                break;            case URL_ERROR:                //ToastUtil.show(getApplicationContext(), "url異常");                enterHome();                break;            case IO_ERROR:                //ToastUtil.show(getApplicationContext(), "讀取異常");                enterHome();                break;            case JSON_ERROR:                //ToastUtil.show(getApplicationContext(), "json解析異常");                enterHome();                break;            default:                break;            }        };    };

在定義一些出現狀態代碼和出現異常時候的錯誤碼:

    /**     * 更新新版本的狀態代碼     */    protected static final int UPDATE_VERSION = 100;    /**     * 進入應用程式主介面狀態代碼     */    protected static final int ENTER_HOME = 101;        /**     * url地址出錯狀態代碼     */    protected static final int URL_ERROR = 102;    //以下是其他各種出錯狀態代碼    protected static final int IO_ERROR = 103;    protected static final int JSON_ERROR = 104;

接著實現enterHome()函數,作用:跳轉到主介面

    /**     * 進入應用程式主介面     */    protected void enterHome() {        Intent intent = new Intent(this, HomeActivity.class);        startActivity(intent);        //在開啟一個新的介面後,將導航介面關閉(導航介面只可見一次)        finish();    }

所以順便建立一個HomeActivity.java

public class HomeActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_home);    }}

當然還有一個activity_home.xml檔案,隨便加一點代碼,先看到效果,後期再修改

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <TextView        android:text="HOMEACTIVITY"        android:textSize="20sp"        android:textColor="#000"        android:layout_width="wrap_content"        android:layout_height="wrap_content" /></LinearLayout>

運行項目後發現,當沒有版本更新的時候,splash介面停留的時間很短,於是可以將指定睡眠時間,當請求網路的時間長度超過4秒則不做處理,請求網路的時間長度小於4秒,強制讓其睡眠滿4秒鐘。這樣splash介面會停留一會,然後跳轉到HomeActivity介面

    //指定睡眠時間,請求網路的時間長度超過4秒則不做處理                    //請求網路的時間長度小於4秒,強制讓其睡眠滿4秒鐘                    long endTime = System.currentTimeMillis();                    if(endTime - startTime < 4000) {                        try {                            Thread.sleep(4000 - (endTime - startTime));                        } catch (Exception e) {                            // TODO Auto-generated catch block                            e.printStackTrace();                        }                    }                    mHandler.sendMessage(msg);

完整的代碼如下:

package com.wuyudong.mobilesafe.activity;import java.io.IOException;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;import org.json.JSONException;import org.json.JSONObject;import com.wuyudong.mobilesafe.R;import com.wuyudong.mobilesafe.Utils.StreamUtil;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.app.Activity;import android.content.Intent;import android.content.pm.PackageInfo;import android.content.pm.PackageManager;import android.util.Log;import android.widget.TextView;/** * @author wuyudong *  */public class SplashActivity extends Activity {    protected static final String tag = "SplashActivity";    /**     * 更新新版本的狀態代碼     */    protected static final int UPDATE_VERSION = 100;    /**     * 進入應用程式主介面狀態代碼     */    protected static final int ENTER_HOME = 101;        /**     * url地址出錯狀態代碼     */    protected static final int URL_ERROR = 102;    //以下是其他各種出錯狀態代碼    protected static final int IO_ERROR = 103;    protected static final int JSON_ERROR = 104;        private TextView tv_version_name;    private int mLocalVersionCode;    private String mVersionDes;    private String mDownloadUrl;        private Handler mHandler = new Handler() {        //        public void handleMessage(android.os.Message msg) {            switch (msg.what) {            case UPDATE_VERSION:                //彈出對話方塊,提示使用者更新                //showUpdateDialog();                break;            case ENTER_HOME:                //進入應用程式主介面,activity跳轉過程                enterHome();                break;            case URL_ERROR:                //ToastUtil.show(getApplicationContext(), "url異常");                enterHome();                break;            case IO_ERROR:                //ToastUtil.show(getApplicationContext(), "讀取異常");                enterHome();                break;            case JSON_ERROR:                //ToastUtil.show(getApplicationContext(), "json解析異常");                enterHome();                break;            default:                break;            }        };    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        // 去掉當前actinity的tittle        // requestWindowFeature(Window.FEATURE_NO_TITLE);        setContentView(R.layout.activity_splash);        // 初始化UI        initUI();        // 初始化資料        initData();    }    /**     * 進入應用程式主介面     */    protected void enterHome() {        Intent intent = new Intent(this, HomeActivity.class);        startActivity(intent);        //在開啟一個新的介面後,將導航介面關閉(導航介面只可見一次)        finish();    }    /**     * 擷取資料方法     */    private void initData() {        // 1.應用版本名稱        tv_version_name.setText("版本名:" + getVersionName());        // 檢測(本地版本號碼與伺服器版本號碼比對)是否有更新,如果有更新,提示使用者下載        // 2.擷取本地版本號碼        mLocalVersionCode = getVersionCode();        // 3,擷取伺服器版本號碼(用戶端發請求,服務端給響應,(json,xml))        // http://www.oxxx.com/update74.json?key=value 返回200 請求成功,流的方式將資料讀取下來        // json中內容包含:        /*         * 更新版本的版本名稱|新版本的描述資訊|伺服器版本號碼|新版本apk         */        checkVersion();    }    /**     * 檢測版本號碼     */    private void checkVersion() {        new Thread() {            public void run() {                // 發送請求擷取資料,參數則為請求json的連結地址                // http://192.168.13.99:8080/update.json 測試階段不是最優                // 僅限於模擬器訪問電腦tomcat                Message msg = Message.obtain();                long startTime = System.currentTimeMillis();                try {                    // 1,封裝url地址                    URL url = new URL("http://169.254.178.87:8080/update.json");                    // 2,開啟一個連結                    HttpURLConnection connection = (HttpURLConnection) url.openConnection();                    // 3,設定常見請求參數(要求標頭)                    // 請求逾時                    connection.setConnectTimeout(2000);                    // 讀取逾時                    connection.setReadTimeout(2000);                                        // 預設就是get請求方式                    //connection.setRequestMethod("POST");                                        // 4,擷取請求成功響應碼                    if(connection.getResponseCode() == 200) {                        // 5,以流的形式,將資料擷取下來                        InputStream is = connection.getInputStream();                        // 6,將流轉換成字串(工具類封裝)                        String json = StreamUtil.streamToString(is);                        // 記得添加許可權-->android.permission.INTERNET                        Log.i(tag, json);                                                    //7,json解析                        JSONObject jsonObject = new JSONObject(json);                                                //debug調試,解決問題                        String versionName = jsonObject.getString("versionName");                        mVersionDes = jsonObject.getString("versionDes");                        String versionCode = jsonObject.getString("versionCode");                        mDownloadUrl = jsonObject.getString("downloadUrl");                                                // 日誌列印                            Log.i(tag, versionName);                        Log.i(tag, mVersionDes);                        Log.i(tag, versionCode);                        Log.i(tag, mDownloadUrl);                                                //8,比對版本號碼(伺服器版本號碼>本地版本號碼,提示使用者更新)                        if(mLocalVersionCode < Integer.parseInt(versionCode)) {                            //提示使用者更新,彈出對話方塊(UI),訊息機制                            msg.what = UPDATE_VERSION;                                                    } else {                            //進入應用程式主介面                            msg.what = ENTER_HOME;                        }                    }                                    } catch (MalformedURLException e) {                    e.printStackTrace();                    msg.what = URL_ERROR;                } catch (IOException e) {                    e.printStackTrace();                    msg.what = IO_ERROR;                } catch (JSONException e) {                    e.printStackTrace();                    msg.what = JSON_ERROR;                } finally {                    //指定睡眠時間,請求網路的時間長度超過4秒則不做處理                    //請求網路的時間長度小於4秒,強制讓其睡眠滿4秒鐘                    long endTime = System.currentTimeMillis();                    if(endTime - startTime < 4000) {                        try {                            Thread.sleep(4000 - (endTime - startTime));                        } catch (Exception e) {                            // TODO Auto-generated catch block                            e.printStackTrace();                        }                    }                    mHandler.sendMessage(msg);                }            };        }.start();    }    /**     * 返回版本號碼的方法     *      * @return 非0代表成功     */    private int getVersionCode() {        // 1.管理者對象packageManager        PackageManager pm = getPackageManager();        // 2.從包的管理者對象中,擷取指定包名的基本資料(版本名稱,版本號碼)        try {            PackageInfo packageInfo = pm.getPackageInfo(getPackageName(), 0);            // 3.擷取版本名稱            return packageInfo.versionCode;        } catch (Exception e) {            e.printStackTrace();        }        return 0;    }    /**     * 擷取版本名稱:資訊清單檔中     *      * @return 應用版本名稱 返回null代表有異常     */    private String getVersionName() {        // 1.管理者對象packageManager        PackageManager pm = getPackageManager();        // 2.從包的管理者對象中,擷取指定包名的基本資料(版本名稱,版本號碼)        try {            PackageInfo packageInfo = pm.getPackageInfo(getPackageName(), 0);            // 3.擷取版本名稱            return packageInfo.versionName;        } catch (Exception e) {            e.printStackTrace();        }        return null;    }    /**     * 初始化UI方法 alt+shift+j     */    private void initUI() {        tv_version_name = (TextView) findViewById(R.id.tv_version_name);    }}

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.