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); }}