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で取得を行いました。次回は、この値をパースできるように勉強したいと思います。