getText() error 관련 질문.

조회수 2253회
private class HttpAsyncTask extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... urls) {

        person = new Person();
        person.setName(etName.getText().toString());    //etName.getText() 에러
        person.setCountry(etCountry.getText().toString()); //etCountry.getText() 에러
        person.setTwitter(etTwitter.getText().toString()); //etTwitter.getText() 에러

        return POST(urls[0], person);
    }

    // onPostExecute displays the results of the AsyncTask.
    @Override
    protected void onPostExecute(String result) {
        Toast.makeText(getBaseContext(), "Data Sent!", Toast.LENGTH_LONG).show();
    }
}

이런 코드가 있는데요. person이라는 클래스에는 name, country, twitter 변수를 지정해 놓았습니다. .set 하는 세부분에서 에러가 발생합니다. Method getText must be called from the UI thread, currently inferred thread is worker less... 라는 메세지는 주는데, 이게 제가 짠 코드가 아니라 기존에 배포된 프로젝트를 가져다가 해보려고 한건데 이런 에러 메세지가 나옵니다. 참고하려던 페이지는 http://hmkcode.com/android-send-json-data-to-server/ 이것입니다. 이유가 뭔가 알고 싶네요 ㅠㅠ..

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • EditText의 getText() 함수가 작업 스레드(Worker thread)에서 호출됐기 때문에 발생하는 에러입니다. 안드로이드에서 UI와 관련된 처리는 반드시 UI 스레드 내에서 호출되어야 합니다. 달리 말하면 안드로이드 UI는 스레드로부터 안전하지 않기 때문에 UI 스레드가 아닌 곳에서 View를 조작할 경우, 위와 같은 에러가 발생합니다.

    좀 더 자세한 내용은 다음 문서의 스레드 항목을 읽어보시기 바랍니다.

    다음과 같이 코드를 변경해보세요.

    // HttpAsyncTask를 실행하는 부분
    new HttpAsyncTask().execute(
        etName.getText().toString(), 
        etCountry.getText().toString(), 
        etTwitter.getText().toString(), 
        "http://hmkcode.appspot.com/jsonservlet");
    
    ...
    
    // doInBackground 함수 
    @Override
    protected String doInBackground(String... args) {
        person = new Person();
        person.setName(args[0]);    
        person.setCountry(args[1]); 
        person.setTwitter(args[2]); 
    
        return POST(args[3], person);
    }
    
    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)