質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.11%

Androidでサーバー上のテキストファイルを読み込みたい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,598

score 10

Androidでサーバー上のテキストファイルを読み込みたい

表題の通り、サーバー上のテキストファイルを読み込み、
それをAndroidに表示させたいと考えています。

ログから、テキストファイルを読み込むことが出来ていることは
確認できました。

しかし、アンドロイドの画面には
no data!の文字が表示されている状態です。

どこが悪いのか教えてください。
よろしくお願いします。

発生している問題・エラーメッセージ

06-09 02:08:34.300 2494-2494/? E/libprocessgroup: failed to make and chown /acct/uid_10060: Read-only file system
06-09 02:08:34.300 2494-2494/? W/Zygote: createProcessGroup failed, kernel missing CONFIG_CGROUP_CPUACCT?
06-09 02:08:34.301 2494-2494/? I/art: Not late-enabling -Xcheck:jni (already on)
06-09 02:08:34.326 2494-2502/? E/art: Failed sending reply to debugger: Broken pipe
06-09 02:08:34.326 2494-2502/? I/art: Debugger is no longer active
06-09 02:08:34.466 2494-2494/? I/InstantRun: starting instant run server: is main process
06-09 02:08:34.602 2494-2494/? W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
06-09 02:08:34.864 2494-2511/? I/System.out: 1
06-09 02:08:34.899 2494-2511/? I/System.out: 2
06-09 02:08:34.937 2494-2511/? I/System.out: 3
06-09 02:08:34.937 2494-2511/? I/System.out: hello hello world world ←sample.txtに書き込まれているデータです。
06-09 02:08:35.500 2494-2494/com.example.blue.getmydata W/art: Before Android 4.1, method int android.support.v7.widget.ListViewCompat.lookForSelectablePosition(int, boolean) would have incorrectly overridden the package-private method in android.widget.ListView
06-09 02:08:35.524 2494-2494/com.example.blue.getmydata D/gralloc_ranchu: Emulator without host-side GPU emulation detected.

該当のソースコード

public class MainActivity extends AppCompatActivity {

    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = (TextView)findViewById(R.id.tv_output);
        new GetMyData(textView).execute();
    }
}
public class GetMyData extends AsyncTask<Void, Void, String> {

    TextView textView;

    public GetMyData(TextView textView){
        super();
        this.textView = textView;
    }

    @Override
    protected String doInBackground(Void ... v){

        String line = "";

        try{
            System.out.println("1");

            URL url = new URL("サーバーのURL/sample.txt");
            HttpURLConnection http = (HttpURLConnection)url.openConnection();
            http.setRequestMethod("GET");
            http.connect();

            System.out.println("2");

            InputStreamReader in = new InputStreamReader(http.getInputStream(), "EUC-JP");
            BufferedReader br = new BufferedReader(in);

            System.out.println("3");

            while((line = br.readLine()) != null){
                System.out.println(line);
            }

            br.close();
            in.close();
            http.disconnect();

        }catch(Exception e){
            System.out.println(e);
        }
        return line;
    }

    protected void onPostExecute(String data){
        super.onPostExecute(data);
        if(data != null){
            textView.setText(data);
        }else{
            textView.setText("no data!");
        }
    }
}

補足情報(言語/FW/ツール等のバージョンなど)

Android Studio 2.3.2
Emulator Android 5.0.2 API 21

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

下記の箇所でnullになるまでループを続けるため、最終的にlineはnullになります。

while((line = br.readLine()) != null)

lineとは別にStringBuilder等で返却する文字列を作成しましょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/09 19:08

    回答ありがとうございます。
    こんなにも早く回答いただけて、とても嬉しかったです。

    キャンセル

checkベストアンサー

0

doInBackgroundで戻り値として返しているlineは、
while((line = br.readLine()) != null)によって、
1行分の文字列代入(上書き)を繰り返された末、
文の終端に到達してnullが代入されて、while文を抜けるため、
returnの時点でnullが設定されています。
onPostExecuteのdataには、doInBackgroundの戻り値が設定されるため、
元のコードでは文章の内容にかかわらずnullが設定されてしまいます。

動作は確認していませんが、取り急ぎ修正案を提示いたします。

public class GetMyData extends AsyncTask<Void, Void, String> {

    TextView textView;

    public GetMyData(TextView textView){
        super();
        this.textView = textView;
    }

    @Override
    protected String doInBackground(Void ... v){

        String line = "";
        StringBuilder sb = new StringBuilder();//追加
        try{
            System.out.println("1");

            URL url = new URL("サーバーのURL/sample.txt");
            HttpURLConnection http = (HttpURLConnection)url.openConnection();
            http.setRequestMethod("GET");
            http.connect();

            System.out.println("2");

            InputStreamReader in = new InputStreamReader(http.getInputStream(), "EUC-JP");
            BufferedReader br = new BufferedReader(in);

            System.out.println("3");

            while((line = br.readLine()) != null){
                System.out.println(line);
                if(sb.length() > 0) sb.append('\n');//追加
                sb.append(line);//追加
            }

            br.close();
            in.close();
            http.disconnect();

        }catch(Exception e){
            System.out.println(e);
        }
        return sb.toString();//変更
    }

    protected void onPostExecute(String data){
        super.onPostExecute(data);
        if(data != null){
            textView.setText(data);
        }else{
            textView.setText("no data!");
        }
    }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/09 19:11

    回答ありがとうございます。
    すごく丁寧に説明していただけて
    実際に動くようになりました。
    ベストアンサーとさせていただきます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.11%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る