Chcę poczekać na zakończenie określonej operacji przed kontynuowaniem przepływu kodu. Coś takiego:

protected void onCreate(Bundle savedInstanceState) {

downloadSomeFiles(); // I want to wait for this operation to finish
Log.d("Download", "Download Complete") //This should run After downloading completed
}

Jednak pobieranie zajmuje trochę czasu i zawsze kończy się otrzymaniem NullPointerException, ponieważ pobieranie nie zostało ukończone. Załóżmy, że nie wiemy, jak długo musimy czekać.

1
HotJava 2 kwiecień 2020, 22:25

3 odpowiedzi

Najlepsza odpowiedź

Długotrwałe operacje na głównym wątku nigdy nie są dobrym pomysłem, ponieważ blokują interfejs użytkownika.

Jeśli chcesz to zrobić, gdy aplikacja jest uruchomiona, rozważ użycie metod z pakietu java.util.concurrent (lub programów, jeśli chcesz przełączyć się na Kotlin). AsyncTask został wycofany. Oto przewodnik: https://www.baeldung.com/java-concurrency

Jeśli chcesz, aby pobieranie było wykonywane w tle, nawet jeśli aplikacja jest zamknięta, rozważ użycie Service: https://developer.android.com/guide/components/services

1
Halex 2 kwiecień 2020, 19:53

Mogłem tylko zasugerować użycie Asynctask <>

Oto przykładowe podejście do zrozumienia. Chcę to tylko skomentować, ale nie mam wystarczającej reputacji, aby to zrobić.

AsyncTask<String, String, String> asyncTask = new AsyncTask<String, String, String> {
   @Override
   protected void onPreExecute() {
       super.onPreExecute();
       // ... Show a Progress Dialog or anything you want just to indicate that you 
       // ... are downloading ...
   }

   @Override
   protected void onProgressUpdate(String... values) {
       super.onProgressUpdate(values);
   }

   @Override
   protected String doInBackground(String... strings) {
       // ... Do Downloading or anything
   }

   @Override
   protected void onPostExecute(String s) {
       super.onPostExecute(s);

       // Post any codes to be followed here ...
       Log.d("Download", "Download Complete")
   }
}

asynTask.execute();
1
I Am Arien 2 kwiecień 2020, 19:55

Utwórz odpowiedź zwrotną w następujący sposób:

public interface ResponseCallback {
        void onDownload();
}

Następnie w swojej metodzie

downloadSomeFiles(ResponseCallback responsecallback) {
    //Download files
    responsecallback.onDownload(); //Trigger it
}

Więc zadzwoń

protected void onCreate(Bundle savedInstanceState) {

downloadSomeFiles(new ResponseCallback() {
            @Override
            public void onDownload() {
                Log.d("Download", "Download Complete");
            }
});
1
NattoShaw 3 kwiecień 2020, 06:31