#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"));
}
}
}