m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

androidでRSSを取得する

いまさら感

基本、javaは業務経験ないのでこういう場面でしか使わないので勉強、勉強

環境

android 5.x系のエミュレータを使用
もうどの辺をバージョンとして考えるかは不明だけど今年辺りからsimフリーになったし
新し目のスマホを手に入れていることを考慮してもいいはず

画面

f:id:m_shige1979:20150705001035p:plain

RSSとかの処理は非同期でしか取得できない

ライブラリなどもきいたことはあるけどまずはなしの状態で最初からやってみる

MainActivity
package jp.mshige1979.app.sampleapp01;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;

import android.os.Handler;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

    private Handler handler;
    private final String RSS_URL = "http://m-shige1979.hatenablog.com/rss";
    private TextView text1;
    private String RssText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        handler = new Handler();

        setContentView(R.layout.activity_main);

        text1 = (TextView)findViewById(R.id.textview1);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        // メニューボタンを追加
        MenuItem item1 = menu.add("UPDATE");
        item1.setIcon(android.R.drawable.ic_menu_upload);

        item1.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {

                Thread thread1 = new Thread() {
                    @Override
                    public void run() {
                        try {
                            // URLよりRSSを取得
                            RssText = RssParse.getRss(MainActivity.this, RSS_URL);

                            // handler
                            handler.post(new Runnable() {
                                @Override
                                public void run() {
                                    // 読み込み終了
                                    text1.setText(RssText);
                                    Toast.makeText(MainActivity.this, "読み込み終了", Toast.LENGTH_SHORT).show();
                                }
                            });

                        } catch (Exception e) {
                            Log.d("sample", e.getMessage());
                        }
                    }
                };
                thread1.start();

                return false;
            }
        });

        // 画面にメニューを表示
        item1.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);

        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);

        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }


}

RssParse
package jp.mshige1979.app.sampleapp01;

import android.content.Context;
import android.net.http.AndroidHttpClient;

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpUriRequest;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * RSSを取得するクラス
 */
public class RssParse{
    public static String getRss(Context context, String url)
        throws IOException{

        StringBuilder sb = new StringBuilder();

        AndroidHttpClient client = AndroidHttpClient.newInstance("TEST");
        HttpGet get = new HttpGet(url);

        try{
            // リクエストを取得
            HttpResponse response = client.execute(get);

            BufferedReader br = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
            String line = null;
            while((line = br.readLine()) != null){
                sb.append(line);
            }

        }finally {
            // 閉じる
            client.close();
        }

        return sb.toString();

    }
}

結果

f:id:m_shige1979:20150705001102p:plain

やったこと

  1. RSS取得用のクラスを用意
  2. Handlerで非同期後の結果をtextviewに貼り付け
  3. 別スレッドで起動

所感

XMLをパースしてリストビューとの割り当てはまた後日
バージョンが変わったせいか以前の方法とはまた処理があわなくで混乱気味

参考

Android Studioではじめる 簡単Androidアプリ開発

Android Studioではじめる 簡単Androidアプリ開発

Android Studioではじめる 簡単Androidアプリ開発

Android Studioではじめる 簡単Androidアプリ開発