Тема: Асинхронна робота потоків(Android/Java)
Привіт!
Як визначити у головному потоці що код в асинхронному потоці вже закінчив свою роботу?
Наприклад:
public class MainActivity extends AppCompatActivity {
Server server = new Server();
static TextView info;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
info = findViewById(R.id.info);
new Thread(new Runnable() {
public void run() {
server.download();//створення запиту на сервер у власному класі
}
}).start();
/*
Якщо створити метод який буде зберігати відповідь сервера і викликати його тут
server.getResult();//метод повертає відповідь сервера
То це поверне null так як сервер ще не встиг відповісти.
Як тут у головному потоці взнати що настала пора викликати server.getResult() для подальшої обробки
*/
}
//якщо використати цей метод то приходиться переводити все у static що викликає перезавантаження пам'яті
public static void result(ServerInfo si){
info.setText(si.getInfo);
}
}
public class Server{
public String SN = "http://mysait.com";
public ServerInfo serverInfo;
public void download(){
Retrofit retrofit = new Retrofit.Builder()
.baseUrl (SN)
.addConverterFactory (GsonConverterFactory.create ())
.build();
request = retrofit.create(GetRequest_Interface.class);
Call<ServerInfo> call = request.Info(SN + "/info.php?info=1");
call.enqueue(new Callback<ServerInfo>() {
serverInfo;
@Override
public void onResponse(@NonNull Call<ServerInfo> call, @NonNull Response<ServerInfo> response) {
if(response.isSuccessful()){
serverInfo = response.body();
}else{}
MainActivity.result(serverInfo);//якщо використати цей рядок то потрібно створювати статичний метод в головному потоці
}
@Override
public void onFailure(@NonNull Call<ServerInfo> call, @NonNull Throwable t) { }
});
}
public ServerInfo getResult(){
...
return serverInfo;
}
}
Це урізаний код з нього викинуто майже все. Залишив лише головне. Проблему у тому що якщо я використовую статичний метод то приходиться все переводити на статичне(TextView, ImegaView ...), а їх дуже багато. В кінці виходить що пам'ять переповнюється якщо переходити між Activity туди і назад.
Тому повернемось до питання:
Як визначити у головному потоці що код в асинхронному потоці вже закінчив свою роботу?
або можна
Як звільнити пам'ять?
Якщо є посилання на статі то їх теж скидуйде.