Обновление пользовательского интерфейса из Android-AsyncTask в цикле while

#java #android #sockets #android-asynctask

#java #Android #сокеты #android-asynctask

Вопрос:

Я использую цикл while в AsyncTask. Программа ожидает запроса сокета, например

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

Как я могу обновить основной пользовательский интерфейс из этого цикла AsyncTask. Обычно запрещается обновлять основной поток, и это doPostExecute не решает проблему, потому что тогда я должен покинуть цикл while.

Комментарии:

1. Я уверен, что в некоторых местах я видел учебные пособия по программированию сокетов Android. Я не думаю, что они использовали AsyncTask, а скорее поток или службу, я думаю

Ответ №1:

Одним из способов достижения этой цели может быть вызов 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"));
        }
    }
}