ProgressDialogを使う
Rssを取得するアプリは、以前から完成してたが
本を色々と読んでいると、やはり呼応性がかなり重要だなと・・・
今までもちょくちょく目にしてた「Application Not Responding」(以降ANR)ので
直さないと思っていたので、ProgressDialogを実装することにしました。
ProgressDialogの実装を参考にさせて頂いたのは、
今回も、id:minghaiさんのアプリです。
すでに、id:minghaiさんのエントリーでHandlerを使用しないと
いけないのは知っていました。
一応、APIDemoのソースを見て、組み込んでみましたが
やはり無理でした。
とりあえず、下記が実装したソースの一部
まずHandlerを作成しておきます。
final Handler h = new Handler();
次に、ダイアログを生成
今回は、進捗を表示しないのでデフォルトのクルクルでOK。
pd = new ProgressDialog(Transition3d.this); pd.setMessage("Now Processing..."); pd.setTitle("Loading ...."); pd.show();
次に、RSSを取得する少し時間のかかる部分をスレッドで呼び出します。
new Thread() { public void run() { try{ holder = kfc.getRssData(); if(holder.getTitle().size() < 1) { isData = false; } } catch(Exception e) { isData = false; } h.post(new Runnable() { public void run() { loadData(); } }); } }.start();
h.postメソッドの引数Runnable#runで実行しているloadDataメソッドは
読み込み完了しているかをチェックしてます。
チェックしてるといっても、インスタンスが生成されているかどうかを
見てるだけですが・・・
結果インスタンスを存在する場合、画面表示を更新します。
private void loadData() { new FeedLoader().load(); } private class FeedLoader { private Handler mHandler = new Handler(); private Runnable mRun = new Runnable() { public void run() { check(); } }; void load() { mHandler.post(mRun); } void check() { if (holder != null) { // Only last time changes mRun to exit mRun = new Runnable() { public void run() { updateUI(); } }; } load(); } }
これでなんとかなりました。
実は、Javaもそれほどしっかりと理解してないので
ここらへん(Threadとか)が凄く苦手だったりします。
勉強しないと駄目だな。。。