JSONの読み込みをしたい!

JSONの読み込みの勉強をしたいと思います。

最近では、xmlよりもjsonが使われる事もずいぶん多くなった気がします。

自分では感じる事はそんなにないのですが、サイズなども軽いようです。

また形式的には、objectに近いので、扱いやすいと言う点が上げられるようです。

 

まずは、読み込みの処理なのでマニフェストにINTERNETを追加します。

<uses-permission android:name="android.permission.INTERNET"/>

 

次に読み込みの際には、androidのthread構造の為、他の動作がとまってしまう→ローディングが動かない。と言う症状を回避する為に、asyncTaskのクラスを作成します。

asyncTaskに関しては、3つの引数が設定できるのですが、呼び出し元のクラスを参照したいので、そのactivityとあとは適当にstringを設定してみました。

public class JsonLoader extends AsyncTask<String,TestActivity, String> {
 TestActivity _teAct;
 // コンストラクタ  
 public JsonLoader(String _str1,teActivity activity, String _str2) {  
 _teAct = activity;
 }

コンストラクタで、呼び出し元のactivityを参照できました(もちろん呼び出し元からの設定も必要ですが。。)

また、asyncTaskで、は「はじめ」「実行」「終わり」実装ができるので、はじめに、ローディングの設定をして終わりにローディングをけしましょう。

はじめ

@Override  
 protected void onPreExecute() {  
 // プログレスバーを表示する  
 _pd = new ProgressDialog(_teAct);  
 _pd.setMessage("Now Loading...");  
 _pd.show();  
 }

おわり

// メインスレッド上で実行される  
 @Override  
 protected void onPostExecute(String result) {  
 _pd.dismiss();  
 Toast.makeText(_teAct,result,Toast.LENGTH_LONG).show();
 }

終わりの時には読み取った値をToastで表示できるようにしました。

また、実行に際してですが、JSONの読み込みは下記を参考にさせていただきました。

【Android開発】HttpClientとHttpGetでサーバーとjson通信する|SE奮闘気

ここで紹介されているgetDataと言うクラスです。

/** 
 * 指定URLからgetした文字列を取得する 
 * @param sUrl 
 * @return 
 */  
 public String getData(String sUrl) {  
 HttpClient objHttp = new DefaultHttpClient();  
 HttpParams params = objHttp.getParams();  
 HttpConnectionParams.setConnectionTimeout(params, 1000); //接続のタイムアウト  
 HttpConnectionParams.setSoTimeout(params, 1000); //データ取得のタイムアウト  
 String sReturn = "";  
 try {  
 HttpGet objGet   = new HttpGet(sUrl);  
 HttpResponse objResponse = objHttp.execute(objGet);  
 if (objResponse.getStatusLine().getStatusCode() < 400){  
 InputStream objStream = objResponse.getEntity().getContent();  
 InputStreamReader objReader = new InputStreamReader(objStream);  
 BufferedReader objBuf = new BufferedReader(objReader);  
 StringBuilder objJson = new StringBuilder();  
 String sLine;  
 while((sLine = objBuf.readLine()) != null){  
 objJson.append(sLine);  
 }  
 sReturn = objJson.toString();  
 objStream.close();  
 }  
 } catch (IOException e) {  
 return null;  
 }     
 return sReturn;  
 }

この中にToastを入れて値を確認しようとして失敗しました。(使っちゃダメみたいです。。)

これを用いて実行のフェーズは次のようにしました。

@Override
 protected String doInBackground(String... params) {
 String _str= getData(params[0]);
 return _str;
 }

これで、jsonのファイルを読み込んで、Toastで表示をするasyncTaskの完成です。

 

上記をメインのクラスから呼ぶ時は以下の形です。

public static final String RSS_FEED_URL = "http://api.twitter.com/1/statuses/user_timeline/shunjiro.json";
// タスクを起動する  
 JsonLoader task = new JsonLoader("" ,this,"");  
 task.execute(RSS_FEED_URL);

※すいません。僕のツイートを呼んでいます。

今回はJSONのデータをそのままStringで取得を行いました。次回は、この値をパースできるように勉強したいと思います。

 

前後の記事

前の記事:

次の記事:

関連の記事

コメントの投稿

  • サイト内検索

新作アプリの紹介

関連サイトの紹介

アンドロイドアプリ開発TIPS
きぐるみカメラ
ふらいぱん
アンドロイドのデザイン集
Page top↑