Ожидание указанной операции c - Android - PullRequest
1 голос
/ 02 апреля 2020

Я хочу дождаться завершения указанной операции c, прежде чем продолжить поток кода. Примерно так:

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
}

Однако загрузка занимает некоторое время, и я всегда получаю исключение NullPointerException, потому что загрузка не была завершена. Предположим, мы не знаем, как долго мы должны ждать.

Ответы [ 3 ]

1 голос
/ 02 апреля 2020

Я мог бы только предложить использовать Asyntask <>

Вот вам примерный подход для понимания. Я просто хочу прокомментировать это, но у меня недостаточно репутации, чтобы сделать это.

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 голос
/ 02 апреля 2020

Создайте ответный обратный вызов, например:

public interface ResponseCallback {
        void onDownload();
}

Затем в вашем методе

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

Затем вызовите его

protected void onCreate(Bundle savedInstanceState) {

downloadSomeFiles(new ResponseCallback() {
            @Override
            public void onDownload() {
                Log.d("Download", "Download Complete");
            }
});
1 голос
/ 02 апреля 2020

Длительные операции в главном потоке никогда не являются хорошей идеей, поскольку они блокируют интерфейс пользователя.

Если вы хотите сделать это во время работы приложения, рассмотрите возможность использования методов из пакета java.util.concurrent (или сопрограмм, если вы хотите переключиться на Kotlin). AsyncTask устарел. Вот руководство: https://www.baeldung.com/java-concurrency

Если вы хотите, чтобы загрузка выполнялась в фоновом режиме, даже если ваше приложение закрыто, рассмотрите возможность использования Service: https://developer.android.com/guide/components/services

...