Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android手機衛士(三):解析json與消息機制發送不同類型消息

Android手機衛士(三):解析json與消息機制發送不同類型消息

編輯:Android開發實例

  1、解析json數據

  解析json的代碼很簡單

Java代碼
  1. JSONObject jsonObject = new JSONObject(json);  
  2.                           
  3. //debug調試,解決問題  
  4. String versionName = jsonObject.getString("versionName");  
  5. mVersionDes = jsonObject.getString("versionDes");  
  6. String versionCode = jsonObject.getString("versionCode");  
  7. mDownloadUrl = jsonObject.getString("downloadUrl");  
  8. // 日志打印      
  9. Log.i(tag, versionName);  
  10. Log.i(tag, mVersionDes);  
  11. Log.i(tag, versionCode);  
  12. Log.i(tag, mDownloadUrl);  

  2、使用消息機制發送不同類型消息

  在獲取服務器端json數據後,得到app的版本號,通過和客戶端的版本號進行對比

Java代碼
  1. //比對版本號(服務器版本號>本地版本號,提示用戶更新)    
  2. if(mLocalVersionCode < Integer.parseInt(versionCode)) {    
  3.     //提示用戶更新,彈出對話框(UI),消息機制    
  4.     msg.what = UPDATE_VERSION;    
  5.         
  6. } else {    
  7.     //進入應用程序主界面    
  8.     msg.what = ENTER_HOME;    
  9. }

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

  首先新建Handler

Java代碼
  1. private Handler mHandler = new Handler() {  
  2.     //  
  3.     public void handleMessage(android.os.Message msg) {  
  4.         switch (msg.what) {  
  5.         case UPDATE_VERSION:  
  6.             //彈出對話框,提示用戶更新  
  7.             //showUpdateDialog();  
  8.             break;  
  9.         case ENTER_HOME:  
  10.             //進入應用程序主界面,activity跳轉過程  
  11.             enterHome();  
  12.             break;  
  13.         case URL_ERROR:  
  14.             //ToastUtil.show(getApplicationContext(), "url異常");  
  15.             enterHome();  
  16.             break;  
  17.         case IO_ERROR:  
  18.             //ToastUtil.show(getApplicationContext(), "讀取異常");  
  19.             enterHome();  
  20.             break;  
  21.         case JSON_ERROR:  
  22.             //ToastUtil.show(getApplicationContext(), "json解析異常");  
  23.             enterHome();  
  24.             break;  
  25.         default:  
  26.             break;  
  27.         }  
  28.     };  
  29. };  

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

Java代碼
  1. /** 
  2.  * 更新新版本的狀態碼 
  3.  */  
  4. protected static final int UPDATE_VERSION = 100;  
  5. /** 
  6.  * 進入應用程序主界面狀態碼 
  7.  */  
  8. protected static final int ENTER_HOME = 101;  
  9.   
  10. /** 
  11.  * url地址出錯狀態碼 
  12.  */  
  13. protected static final int URL_ERROR = 102;  
  14. //以下是其他各種出錯狀態碼  
  15. protected static final int IO_ERROR = 103;  
  16. protected static final int JSON_ERROR = 104;

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

Java代碼
  1. /** 
  2.  * 進入應用程序主界面 
  3.  */  
  4. protected void enterHome() {  
  5.     Intent intent = new Intent(this, HomeActivity.class);  
  6.     startActivity(intent);  
  7.     //在開啟一個新的界面後,將導航界面關閉(導航界面只可見一次)  
  8.     finish();  
  9. }  

  所以順便新建一個HomeActivity.java

Java代碼
  1. public class HomeActivity extends Activity {  
  2.     @Override  
  3.     protected void onCreate(Bundle savedInstanceState) {  
  4.         super.onCreate(savedInstanceState);  
  5.         setContentView(R.layout.activity_home);  
  6.     }  
  7. }  

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

XML/HTML代碼
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="vertical" >  
  6.   
  7.     <TextView  
  8.         android:text="HOMEACTIVITY"  
  9.         android:textSize="20sp"  
  10.         android:textColor="#000"  
  11.         android:layout_width="wrap_content"  
  12.         android:layout_height="wrap_content" />  
  13.   
  14. </LinearLayout>  

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

Java代碼
  1. //指定睡眠時間,請求網絡的時長超過4秒則不做處理  
  2. //請求網絡的時長小於4秒,強制讓其睡眠滿4秒鐘  
  3. long endTime = System.currentTimeMillis();  
  4. if(endTime - startTime < 4000) {  
  5.     try {  
  6.         Thread.sleep(4000 - (endTime - startTime));  
  7.     } catch (Exception e) {  
  8.         // TODO Auto-generated catch block  
  9.         e.printStackTrace();  
  10.     }  
  11. }  
  12. mHandler.sendMessage(msg);  

       完整的代碼如下:

Java代碼
  1. package com.wuyudong.mobilesafe.activity;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.net.HttpURLConnection;  
  6. import java.net.MalformedURLException;  
  7. import java.net.URL;  
  8.   
  9. import org.json.JSONException;  
  10. import org.json.JSONObject;  
  11.   
  12. import com.wuyudong.mobilesafe.R;  
  13. import com.wuyudong.mobilesafe.Utils.StreamUtil;  
  14.   
  15. import android.os.Bundle;  
  16. import android.os.Handler;  
  17. import android.os.Message;  
  18. import android.app.Activity;  
  19. import android.content.Intent;  
  20. import android.content.pm.PackageInfo;  
  21. import android.content.pm.PackageManager;  
  22. import android.util.Log;  
  23. import android.widget.TextView;  
  24.   
  25. /** 
  26.  * @author wuyudong 
  27.  *  
  28.  */  
  29.   
  30. public class SplashActivity extends Activity {  
  31.   
  32.     protected static final String tag = "SplashActivity";  
  33.     /** 
  34.      * 更新新版本的狀態碼 
  35.      */  
  36.     protected static final int UPDATE_VERSION = 100;  
  37.     /** 
  38.      * 進入應用程序主界面狀態碼 
  39.      */  
  40.     protected static final int ENTER_HOME = 101;  
  41.       
  42.     /** 
  43.      * url地址出錯狀態碼 
  44.      */  
  45.     protected static final int URL_ERROR = 102;  
  46.     //以下是其他各種出錯狀態碼  
  47.     protected static final int IO_ERROR = 103;  
  48.     protected static final int JSON_ERROR = 104;  
  49.       
  50.     private TextView tv_version_name;  
  51.     private int mLocalVersionCode;  
  52.     private String mVersionDes;  
  53.     private String mDownloadUrl;  
  54.       
  55.     private Handler mHandler = new Handler() {  
  56.         //  
  57.         public void handleMessage(android.os.Message msg) {  
  58.             switch (msg.what) {  
  59.             case UPDATE_VERSION:  
  60.                 //彈出對話框,提示用戶更新  
  61.                 //showUpdateDialog();  
  62.                 break;  
  63.             case ENTER_HOME:  
  64.                 //進入應用程序主界面,activity跳轉過程  
  65.                 enterHome();  
  66.                 break;  
  67.             case URL_ERROR:  
  68.                 //ToastUtil.show(getApplicationContext(), "url異常");  
  69.                 enterHome();  
  70.                 break;  
  71.             case IO_ERROR:  
  72.                 //ToastUtil.show(getApplicationContext(), "讀取異常");  
  73.                 enterHome();  
  74.                 break;  
  75.             case JSON_ERROR:  
  76.                 //ToastUtil.show(getApplicationContext(), "json解析異常");  
  77.                 enterHome();  
  78.                 break;  
  79.             default:  
  80.                 break;  
  81.             }  
  82.         };  
  83.     };  
  84.   
  85.     @Override  
  86.     protected void onCreate(Bundle savedInstanceState) {  
  87.         super.onCreate(savedInstanceState);  
  88.         // 去掉當前actinity的tittle  
  89.         // requestWindowFeature(Window.FEATURE_NO_TITLE);  
  90.         setContentView(R.layout.activity_splash);  
  91.   
  92.         // 初始化UI  
  93.         initUI();  
  94.         // 初始化數據  
  95.         initData();  
  96.   
  97.     }  
  98.   
  99.     /** 
  100.      * 進入應用程序主界面 
  101.      */  
  102.     protected void enterHome() {  
  103.         Intent intent = new Intent(this, HomeActivity.class);  
  104.         startActivity(intent);  
  105.         //在開啟一個新的界面後,將導航界面關閉(導航界面只可見一次)  
  106.         finish();  
  107.     }  
  108.   
  109.     /** 
  110.      * 獲取數據方法 
  111.      */  
  112.     private void initData() {  
  113.         // 1.應用版本名稱  
  114.         tv_version_name.setText("版本名:" + getVersionName());  
  115.         // 檢測(本地版本號與服務器版本號比對)是否有更新,如果有更新,提示用戶下載  
  116.         // 2.獲取本地版本號  
  117.         mLocalVersionCode = getVersionCode();  
  118.         // 3,獲取服務器版本號(客戶端發請求,服務端給響應,(json,xml))  
  119.         // http://www.oxxx.com/update74.json?key=value 返回200 請求成功,流的方式將數據讀取下來  
  120.         // json中內容包含:  
  121.         /* 
  122.          * 更新版本的版本名稱|新版本的描述信息|服務器版本號|新版本apk下載地址 
  123.          */  
  124.         checkVersion();  
  125.   
  126.     }  
  127.   
  128.     /** 
  129.      * 檢測版本號 
  130.      */  
  131.     private void checkVersion() {  
  132.         new Thread() {  
  133.             public void run() {  
  134.                 // 發送請求獲取數據,參數則為請求json的鏈接地址  
  135.                 // http://192.168.13.99:8080/update.json 測試階段不是最優  
  136.                 // 僅限於模擬器訪問電腦tomcat  
  137.                 Message msg = Message.obtain();  
  138.                 long startTime = System.currentTimeMillis();  
  139.   
  140.                 try {  
  141.                     // 1,封裝url地址  
  142.                     URL url = new URL("http://169.254.178.87:8080/update.json");  
  143.                     // 2,開啟一個鏈接  
  144.                     HttpURLConnection connection = (HttpURLConnection) url.openConnection();  
  145.                     // 3,設置常見請求參數(請求頭)  
  146.                     // 請求超時  
  147.                     connection.setConnectTimeout(2000);  
  148.                     // 讀取超時  
  149.                     connection.setReadTimeout(2000);  
  150.                       
  151.                     // 默認就是get請求方式  
  152.                     //connection.setRequestMethod("POST");  
  153.                       
  154.                     // 4,獲取請求成功響應碼  
  155.                     if(connection.getResponseCode() == 200) {  
  156.                         // 5,以流的形式,將數據獲取下來  
  157.                         InputStream is = connection.getInputStream();  
  158.                         // 6,將流轉換成字符串(工具類封裝)  
  159.                         String json = StreamUtil.streamToString(is);  
  160.                         // 記得添加權限-->android.permission.INTERNET  
  161.                         Log.i(tag, json);      
  162.                           
  163.                         //7,json解析  
  164.                         JSONObject jsonObject = new JSONObject(json);  
  165.                           
  166.                         //debug調試,解決問題  
  167.                         String versionName = jsonObject.getString("versionName");  
  168.                         mVersionDes = jsonObject.getString("versionDes");  
  169.                         String versionCode = jsonObject.getString("versionCode");  
  170.                         mDownloadUrl = jsonObject.getString("downloadUrl");  
  171.                           
  172.                         // 日志打印      
  173.                         Log.i(tag, versionName);  
  174.                         Log.i(tag, mVersionDes);  
  175.                         Log.i(tag, versionCode);  
  176.                         Log.i(tag, mDownloadUrl);  
  177.                           
  178.                         //8,比對版本號(服務器版本號>本地版本號,提示用戶更新)  
  179.                         if(mLocalVersionCode < Integer.parseInt(versionCode)) {  
  180.                             //提示用戶更新,彈出對話框(UI),消息機制  
  181.                             msg.what = UPDATE_VERSION;  
  182.                               
  183.                         } else {  
  184.                             //進入應用程序主界面  
  185.                             msg.what = ENTER_HOME;  
  186.                         }  
  187.                     }  
  188.                       
  189.                 } catch (MalformedURLException e) {  
  190.                     e.printStackTrace();  
  191.                     msg.what = URL_ERROR;  
  192.                 } catch (IOException e) {  
  193.                     e.printStackTrace();  
  194.                     msg.what = IO_ERROR;  
  195.                 } catch (JSONException e) {  
  196.                     e.printStackTrace();  
  197.                     msg.what = JSON_ERROR;  
  198.                 } finally {  
  199.                     //指定睡眠時間,請求網絡的時長超過4秒則不做處理  
  200.                     //請求網絡的時長小於4秒,強制讓其睡眠滿4秒鐘  
  201.                     long endTime = System.currentTimeMillis();  
  202.                     if(endTime - startTime < 4000) {  
  203.                         try {  
  204.                             Thread.sleep(4000 - (endTime - startTime));  
  205.                         } catch (Exception e) {  
  206.                             // TODO Auto-generated catch block  
  207.                             e.printStackTrace();  
  208.                         }  
  209.                     }  
  210.                     mHandler.sendMessage(msg);  
  211.                 }  
  212.             };  
  213.   
  214.         }.start();  
  215.     }  
  216.   
  217.     /** 
  218.      * 返回版本號的方法 
  219.      *  
  220.      * @return 非0代表成功 
  221.      */  
  222.     private int getVersionCode() {  
  223.   
  224.         // 1.管理者對象packageManager  
  225.         PackageManager pm = getPackageManager();  
  226.         // 2.從包的管理者對象中,獲取指定包名的基本信息(版本名稱,版本號)  
  227.         try {  
  228.             PackageInfo packageInfo = pm.getPackageInfo(getPackageName(), 0);  
  229.             // 3.獲取版本名稱  
  230.             return packageInfo.versionCode;  
  231.         } catch (Exception e) {  
  232.             e.printStackTrace();  
  233.         }  
  234.         return 0;  
  235.   
  236.     }  
  237.   
  238.     /** 
  239.      * 獲取版本名稱:清單文件中 
  240.      *  
  241.      * @return 應用版本名稱 返回null代表有異常 
  242.      */  
  243.     private String getVersionName() {  
  244.         // 1.管理者對象packageManager  
  245.         PackageManager pm = getPackageManager();  
  246.         // 2.從包的管理者對象中,獲取指定包名的基本信息(版本名稱,版本號)  
  247.         try {  
  248.             PackageInfo packageInfo = pm.getPackageInfo(getPackageName(), 0);  
  249.             // 3.獲取版本名稱  
  250.             return packageInfo.versionName;  
  251.         } catch (Exception e) {  
  252.             e.printStackTrace();  
  253.         }  
  254.         return null;  
  255.   
  256.     }  
  257.   
  258.     /** 
  259.      * 初始化UI方法 alt+shift+j 
  260.      */  
  261.     private void initUI() {  
  262.   
  263.         tv_version_name = (TextView) findViewById(R.id.tv_version_name);  
  264.     }  
  265.   
  266. }
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved