東京電力の電力使用状況csvからandroidアプリに | android

ymdyu1さんのブログで東電の電力使用状況をアプリにする記事を見つけましたが、androidバージョンが上がったことで対応していない箇所があったので、自分なりに再構築してみました
http://d.hatena.ne.jp/ymdyu1/20110324/p1

参照先の東京電力の電力使用状況csv
http://www.tepco.co.jp/forecast/html/images/juyo-j.csv

東京電力のファイルを読み込んだ時に文字化けが発生したので、そのとき参照したBufferReaderについてのサイト
http://developer.android.com/intl/ja/reference/java/io/BufferedReader.html
http://ash.jp/java/stream.htm

読み込むCSVファイルの文字コードを指定する時は
                            BufferedReader reader = new BufferedReader(new InputStreamReader(http.getInputStream(), "SJIS"));
ファイル名(),"文字コード"
のようにすればいいようです
東京電力のcsvの場合はSJISでしたが、リンク先の文字コードに合わせて変えてください


拝見した記事が書かれていたのが2011年頃だったので、別スレッドにUIでアクセスできていたようです
http://pentan.info/android/app/multi_thread.html
今はできないのでHandlerを使って

handler.post(new Runnable() {
               @Override
               public void run() {
                   textView.setText(msg); // 画面に描画する処理
               }
});
//
このように囲ってあげて完了
少しハマったと言うかエラーになったのが「.post」のところですが、android studioで勝手にインポートしてくれたのが↓
import java.util.logging.Handler;
//
だったんですが、
import android.os.Handler;
//
android側で用意してくれたやつを使えばいいようです

こちらがコード
import android.os.AsyncTask;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.os.Handler;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
//import java.util.logging.Handler;


public class MainActivity extends ActionBarActivity {

    Button button;
    TextView textView;
    String msg;
    String array[] = null;

//    ここがエラーになる場合は、import文が間違っている場合が多い
    Handler handler = new Handler();

//    改行コードを取得
    static final String BR = System.getProperty("line.separator");

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

//        表示領域
        textView = (TextView) findViewById(R.id.textView);
//        取得ボタン
        button = (Button) findViewById(R.id.text);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            // データ取得
                            URL url = new URL("http://www.tepco.co.jp/forecast/html/images/juyo-j.csv");
                            HttpURLConnection http = (HttpURLConnection) url.openConnection();
                            http.setRequestMethod("GET");
                            http.connect();
                            // データ読込 
                            BufferedReader reader = new BufferedReader(new InputStreamReader(http.getInputStream(), "SJIS"));
                                // 解析
                                while (true) {
                                    String line = reader.readLine();
                                    if (line == null) {
                                        break;
                                    }

                                    if (line.indexOf(",") != -1) {
                                        array = line.split(",");
                                    }

                                    if (array != null) {
                                        for (int i = 0; i < array.length; i++) {
                                            Log.v("array array[", i + "] " + array[i]);
                                            msg += array[i] + " ";
                                        }

                                    } else
                                        Log.e("array", " no array");

                                    msg += BR;

                                }

                                handler.post(new Runnable() {
                                    @Override
                                    public void run() {
                                        // 画面に描画する処理
                                        textView.setText(msg); 
                                    }
                                });

                            http.disconnect();
                            reader.close();

                        // エラー処理
                        } catch (Exception e) {
                            e.printStackTrace();
                        }

                    }

                }).start();

                // 
                if (array != null){
                    for (int i = 0; i < array.length; i++) {
                        Log.v("array[" + i + "] ", array[i]);
                    }
                }
            }
        });
    }
}
//

こんな感じの画面構成です
xmlはこちら


    
//

manifestファイルにインターネットの通信を許可する文を追加しないと多分エラーになります


/applicationの外側に入れてください

コメント