Тема: Асинхронна робота потоків(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 туди і назад.
Тому повернемось до питання: 
Як визначити у головному потоці що код в асинхронному потоці вже закінчив свою роботу?
або можна
Як звільнити пам'ять?
Якщо є посилання на статі то їх теж скидуйде.
 Але, я так розумію, що API 21 - це щось типу < Java 8. В такому випадку: