Как изменять view элементы из класса унаследованного AsyncTask'ом

294
08 декабря 2017, 04:06

Также попрошу проанализировать код и сказать что в нём можно было бы улучшить. Спасибо.

class SenderThread extends  AsyncTask<String, Void , String> {
private Socket socket;
InputStream sin;
OutputStream sout;
DataInputStream in;
DataOutputStream out;
Button get_string_button = (Button) findViewById(R.id.get_string_button);//Горит красным.
Button get_screen_button = (Button) findViewById(R.id.get_screen_button);
Button quit_button = (Button) findViewById(R.id.quit_button);
CloseSocket closeSocket = new CloseSocket();
@Override
protected void onPreExecute() {
    super.onPreExecute();
    .setEnabled(false);
}
@Override
protected String doInBackground(String... params) {
    String line = null;
    StringBuilder strBuilder = new StringBuilder();
    for (int i = 0; i < params.length; i++) {
        strBuilder.append(params[i]);
    }
    String command = strBuilder.toString();
    try{
        if(socket == null){
            socket = new Socket(ip, 6666);
            sin = socket.getInputStream();
            sout = socket.getOutputStream();
            in = new DataInputStream(sin);
            out = new DataOutputStream(sout);
        }
        if(socket.isConnected()) {
            out.writeUTF(command);
            out.flush();
            line = in.readUTF();
            if(line.equalsIgnoreCase("getScreen") ){
            }
           closeSocket.close(in,out,socket);//закрывает потоки и сокет
            return line.toString();
        }else{
            throw new Exception("Socket not alive!");
        }
}catch(Exception ex)
    {
        return ex.toString();
    }
 }
}
Answer 1

Читаем документацию:

Для работы с UI у AsyncTask есть 3 метода:

  1. onPreExecute() - вызывается до doInBackground().
  2. onPostExecute() - вызывается, когда завершится doInBackground().
  3. onProgressUpdate() - срабатывает, когда вы в doInBackground() вызываете publishProgress().

Если в AsyncTask вы осуществляете какую-то долгую операцию и хотите периодически обновлять состояние UI, используйте переопределённый onProgressUpdate() с вызовом publishProgress(). Иначе же переопределите onPostExecute(), и обращайтесь из него к UI, как завершите все операции.

К примеру, вы хотите после завершения операции в AsyncTask отправить строку в UI.

  1. Определяем интерфейс:

    public interface OperationResult {
       void onGetString(String str);
    }
    
  2. Реализуете в вашей Activity:

    public class MyActivity extends AppCompatActivity implements OperationResult  {
       public void onGetString(String str) {
           // обрабатываете результата выполнения вашего `AsyncTask`           
       }
    }
    
  3. Немного меняете AsyncTask (добавляете конструктор, вызываете метод интерфейса).

    public  class SenderThread extends AsyncTask<String, Void , String> {
        private OperationResult  mCallBack;
        public SenderThread(OperationResult callBack) {
            mCallBack = callBack;
        }
        protected void onPostExecute(String result) {
            mCallBack.onGetString(result);
        }
    }
    

Теперь когда создаёте ваш AsyncTask передавайте в конструктор ссылку на реализацию интерфейса. Если вы создаёте SenderThread прям в Activity, где реализуете интерфейс OperationResult, то передавайте в конструктор this.

READ ALSO
Ошибка чтения/записи при работе с файлом(Java EE)

Ошибка чтения/записи при работе с файлом(Java EE)

Добрый день, возникла очень не понятная ошибка

240
Кто можеть перевести на Java-y? [требует правки]

Кто можеть перевести на Java-y? [требует правки]

1,Записать на место отрицательных элементов матрицы нули, а на место положительных — единицыВывести на печать нижнюю треугольную матрицу...

220
Java.Android.Переход на главную страничку

Java.Android.Переход на главную страничку

Есть вторичная страничка программыВ форме есть кнопка home , которая должна перенести пользователя на главную страничку(которая загружается...

276
Не могу в свою модель данных вогнать Json

Не могу в свою модель данных вогнать Json

Вот json в котором каждый раз появляются новые пары ключ-значение, их то больше , то меньшеЯ хочу добавить каждую пару в отдельную ModelData(String,...

236