2013年8月26日 星期一

Android取得JSON資料

須先引用以下
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;


 //檢查網路連線狀況
    public void chkNetwork(){
        ConnectivityManager connMgr = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
        if (networkInfo != null && networkInfo.isConnected()) {
            Log.d("CHECK_POINT", "網路連線中 " );
            textView1.setText("網路連線中");
            //呼叫AsyncTask
            new  DownloadWebpageTask().execute();

        } else {
            Log.d("CHECK_POINT", "網路斷線 ");
            textView1.setText("網路斷線");
        }
    }



//使用AsyncTask,因為Android4.0之後,網路操作必須放在Thread裡執行,AsyncTask後面的三個參數為1.Params,啟動任務執行的輸入參數2.Progress,後台任務執行的百分比3.Result,後台計算的結果類型,假如一個類型不被使用,可以簡單地使用 Void類型
    private class DownloadWebpageTask extends AsyncTask<Void,Integer,String[]>
    {
     
        @Override
        //要在背景中做的事
        protected String[]  doInBackground(Void... params) {
            try {
                return getWebData();
            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }        
        }



        //@Override
        //背景工作處理完"後"需作的事
       protected void onPostExecute(String[] result) {
            super.onPostExecute(result);
           textView1.setText(result[1]);
        
           //進度BAR消失
           ProgressBar pb=(ProgressBar)findViewById(R.id.progressBar);
           pb.setVisibility(-1);       
        }

        //取得網路資料
        public String[] getWebData() throws IOException{
            URL url=new URL("http://XXX.XXX.XXX.XXX");
            HttpURLConnection conn = (HttpURLConnection)url.openConnection();
            conn.setReadTimeout(10000 /* milliseconds */);
            conn.setConnectTimeout(15000 /* milliseconds */);
            conn.setRequestMethod("GET");
            conn.setDoInput(true);        
            conn.connect();
            BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
            String jsonString= reader.readLine();
            reader.close();
      
            try {
                return (getJson(jsonString));
            } catch (JSONException e) {
                e.printStackTrace();
                return null;
            }
        
        }

//JSOM

 //將JSON字串解析
        public String[]  getJson(String jsonString) throws JSONException {
            //如果是巢狀JSON字串,須分兩次來取資料
            JSONObject jsonObject=new JSONObject(jsonString);
            JSONObject jsonObject2=new JSONObject(jsonObject.getString("JsonString"));
            JSONArray jsonArray=jsonObject2.getJSONArray("PROGTAB");
            String[] jsonString2=new String[jsonArray.length()];
            delDb();
            for(int i=0;i<jsonArray.length();i++)
            {
                //Log.d("DEBUG_TAG", String.valueOf(i));
                jsonString2[i]=jsonArray.getJSONObject(i).getString("@PLAYDT").substring(11,16)+"     "+jsonArray.getJSONObject(i).getString("@PROGNAME");
             
            }
            return jsonString2;
}


在AndroidManifest.xml裡要加上以下權限,才能取得網路資料
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
   <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>

沒有留言:

張貼留言