2016-10-17 3 views
0

AsyncTask에서 while 루프를 사용하고 있습니다. 프로그램이 소켓 요청을 기다리는 중입니다.while-loop에서 Android-AsyncTask의 UI 스레드 업데이트

while(true) { 
    in = readLine(); 
... 
} 

어떻게이 AsyncTask 루프에서 기본 UI를 업데이트 할 수 있습니까? 일반적으로 메인 스레드를 업데이트하는 것은 금지되어 있습니다. doPostExecute에서 문제를 해결하지 못합니다. 왜냐하면 while 루프를 떠나야하기 때문입니다.

+0

일부 지역에서는 Android 소켓 프로그래밍에 대한 자습서를 보았습니다. 나는 그들이 AsyncTask를 사용했다고 생각하지 않지만, Thread 나 Service를 사용한다고 생각한다. –

답변

0

편도이 작업을 수행하려면 루프의 어느 곳에서나 publishProgress(object)을 호출 할 수 있습니다. 이것은 차례로 메인 스레드에서 뷰를 업데이트 할 수있는 onProgressUpdate(Object[]) 메서드를 호출합니다.

아래 예제에서 mTextView는 AsyncTask가 상주하는 클래스의 멤버 변수입니다. 예 :

public class NewtworkActivity extends AppCompatActivity { 
    private TextView mTextView; 

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

     mTextView = (TextView) findViewById(R.id.text_view); 
     .... 
    } 

    private class MySyncTask extends AsyncTask { 
     .... 
     @Override 
     protected Object doInBackground(Object[] objects) { 
      .... 
      while (true) { 
       while ((lineFromServer = mFromServer.readLine()) != null) { 
        Object object[] = { lineFromServer }; 
        publishProgress(object); 
       } 
      } 
     } 

     .... 

     @Override 
     protected void onProgressUpdate(Object[] values) { 
      super.onProgressUpdate(values); 
      if (values.length > 0) { 
       mTextView.append(values[0]+System.getProperty("line.separator")); 
     } 
    } 
}