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

안녕하세요. 쓰레드 내에서 UI 변경이불가능하여 코드 질문합니다

0 추천
 
public class MainActivity extends ActionBarActivity
{
 
    public String inputLine="스트링초기값";
 
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        t1 = (TextView) findViewById(R.id.textbar);
 
        new Thread(new Runnable()
        {
            public void run() {
                스트링변경함수();
            }
        }).start();
 
        t1.setText(inputLine);
 
    }
 
 
 
 
    public void 스트링변경함수()
    {
        inputLine="변경할스트링값";
    }
}
 
초기에 public string에 "초깃값" 을 저장한뒤
 
쓰레드 형식으로 스트링 변경함수를 실행하여 string에 변경할 스트링값을 입력합니다
 
그후
 
t1.setText에 변경되어야할 스트링값을 입력하는 간단한 함수입니다.
 
그런데 setText를 하면 쓰레드를 이용한 함수?? 를 불러온 뒤 그 값을 리턴을 못하는것같아서 어떻게 해야하는지 질문드립니다.
 
이게 하고자하는 질문의 핵심이구요
 
 
 
요약 
쓰레드를 이용하여 스트링값을 받는다
그 스트링값을 setText 를 사용하여 텍스트뷰의 글자를 바꾼다
 
 
 
 
실제 코드는
 
 
public class MainActivity extends ActionBarActivity
{
 
    public TextView t1;
    public String inputLine="퍼블릭스트링";
 
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        base1 = (Button) findViewById(R.id.base1);
        t1 = (TextView) findViewById(R.id.textbar);
 
        t1.setText(inputLine);
 
        new Thread(new Runnable(){
            public void run() {
                URLConnectionReader();
            }
        }).start();
 
       t1.setText(inputLine);
    }
 
    public void URLConnectionReader()
    {
        try {
 
            URL url = new URL("http://192.168.0.2/zuso.html");
 
            URLConnection connection = url.openConnection();
 
            InputStream is = connection.getInputStream();
 
            InputStreamReader isr = new InputStreamReader(is, "UTF-8");
 
            BufferedReader br = new BufferedReader(isr);
 
            inputLine = br.readLine();
 
            t1.setText(inputLine)  // 여기서 UI를 건들면 오류가 나서 어찌할지를 모르겠습니다
        }
        catch (Exception e)
        {
            Log.e("URLError", e.getMessage());
        }
    }
 
 
이고 하고자하는건 서버에서 스트링값을 받은뒤 그 값을이용해 UI에 textview에 받은 값을 넣는것입니다
 
쓰레드를 이용하여 사용할경우
 
Only the original thread that created a view hierarchy can touch its views.
 
내부에서 UI변경이 안된다하여 어찌 할지 잘 모르겠습니다..ㅠㅠ
 
답변해주시면 감사하겠습니다 ㅠㅠ

 

서윤후 님이 2015년 3월 27일 질문

2개의 답변

+1 추천

Thread에서 UI 를 건드릴수 없기 때문에 핸들러를 이용한 UI접근방식이 있어요

 

Thread에서 서버에서 할일을 정의한후에 핸들러를 호출 한뒤 그 값을 핸들러에서 TextView 에 넘겨주시면 될듯합니다.




 

CJ여비 (5,730 포인트) 님이 2015년 3월 27일 답변
감사합니다. 그런데 핸들러가 너무 어렵네요 ㅠㅠ 그전부터 핸들러 보고있었는데 안드 완전 초보라 ㅠㅠ 찾아보고 혹시 모르면 다시 질문하겠습니다.
+1 추천
AsyncTask 를 사용하세요.

doInBackgorund에서 네트워크 작업 처리하고

onPostExecute에서 ui 작업하시면 됩니다.
이드로이드 (22,930 포인트) 님이 2015년 3월 27일 답변
감사합니다. 핸들러랑 asynctask 두개가 있네요 ㅠㅠ 찾아보고 쉬운걸로 해보겠습니다!!
감사합니다!1
...