마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

Thread를 사용하는데 질문이 있습니다.

0 추천
package com.example.bong.threadtest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.method.ScrollingMovementMethod;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    //UI Member
    private Button btn_start;
    private TextView textView_nowDegree;

    //읽은 파일의 값을 저장할 변수
    private ArrayList<String> arrayList;


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

        btn_start = (Button)findViewById(R.id.btn_start);
        textView_nowDegree = (TextView)findViewById(R.id.text_nowdegree);

        textView_nowDegree.setMovementMethod(new ScrollingMovementMethod());

        btn_start.setOnClickListener(click);
    }

    View.OnClickListener click = new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            //클릭을 하면 일단 파일을 불러온다.
            FileLoadThread flt = new FileLoadThread();
            flt.start();

            //파일을 불러온후 그 파일을 한줄씩 읽어 TextView에 출력한다.

            TimerThread tt = new TimerThread();
            tt.start();

        }
    };

    public void loadText(){
        InputStream fis = getResources().openRawResource(R.raw.test);

        arrayList = new ArrayList<String>();

        try{
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fis, "EUC-KR"));
            while (true){
                String string = bufferedReader.readLine();

                if(string != null){
                    arrayList.add(string);
                }else {
                    break;
                }
            }
        }catch (IOException e){e.printStackTrace();}
    }

    public class TimerThread extends Thread{

        @Override
        public void run(){
            int i = 0;
            while (true) {
                try {
                    sleep(1000); //1초 쉼
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if(i >= arrayList.size()){
                    break;
                }
                else if(arrayList.get(i) != null){
                    textView_nowDegree.append(arrayList.get(i) + "\n");
                    i++;
                }
            }
        }
    }
    public class FileLoadThread extends Thread{
        @Override
        public void run(){
            loadText();
        }
    }
}

res/raw/test.txt 에 있는 파일을 불러와서 버튼을 누르면 한줄씩 출력하는 어플을 만들어 봤는데요

어플을 실행하면 바로 종료가 되버리네요 ㅠㅠ 어디가 문제인지 고수님들 도와주세요.

초보 개발자! (140 포인트) 님이 2017년 6월 13일 질문

1개의 답변

0 추천

앱이 죽으면 로그캣에 죽는 원인이 나옵니다. 그 내용을 전문을 복사해서 알려주세요.

 

대충봐서는 MainThread가 아닌 다른 쓰레드(TimerThread)에서 UI를 변경하려고 해서 에러난것 아닌지 의심이 되네요.

 

가장간단한 해결책으로는..

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        textView_nowDegree.append(arrayList.get(i) + "\n");
    }
});

 

Charlesz (4,420 포인트) 님이 2017년 6월 14일 답변
감사합니다! 저는 핸들러를 사용해서 해결을 하긴 했습니다.
...