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とか)が凄く苦手だったりします。
勉強しないと駄目だな。。。