Как запустить код в фоновом режиме SplashScreen в Android

1

Я работаю с одним приложением, которое требует фоновой обработки следующим образом.

Всякий раз, когда я отправляю запрос на URL, я получаю вывод в формате JSON. В JSON у меня есть логическая переменная. Если логическая переменная true, снова мне нужно отправить запрос на URL до тех пор, пока значение логической переменной не станет false.

Но на переднем плане SplashScreen должен работать вместе с панелью Progress. Как я могу это достичь.

Какие-либо предложения?

Теги:

3 ответа

1
Лучший ответ

Используйте AsyncTask, это очень сильный инструмент, но, возможно, более сложный, как другие методы... AsynchTask использует общие типы. Имеет один метод, который вы должны реализовать.

protected T doInBackground(T... params) {
   // body of your method
}

и другие методы. Как правило

protected T doInBackground {}
protected void onProgressUpdate(T... params)
protected void onPostExecute(T param)

Первый T служит для некоторых входных данных. в вашем случае это может быть ваш URL, например. Этот метод (doInBackground) работает на фоновом потоке, как писали мои коллеги выше меня, и они писали, вероятно, все. Так мало похожего примера, как это может выглядеть:

private class DownloadAsyncTask extends AsyncTask<String, DataTransmitted, InputStream> {
      protected InputStream doInBackground(String... params) {

            int contentLength = 0;
            int buffLength = 0;
            int progress = 0;
            InputStream inputStream = null;
            try {

                URL url = new URL(params[0]);
                HttpURLConnection urlConntection = (HttpURLConnection) url.openConnection();
                urlConntection.setRequestMethod("GET");
                urlConntection.setAllowUserInteraction(false);
                urlConntection.setInstanceFollowRedirects(true);
                urlConntection.connect();
                if (urlConntection.getResponseCode() == HttpURLConnection.HTTP_OK) {
                    contentLength = urlConntection.getContentLength();
                    progressDialog.setMax(contentLength);
                    inputStream = urlConntection.getInputStream();

                    while ((buffLength = inputStream.read(MAX_BUFFER)) != -1) {
                        try {
                            Thread.sleep(1);
                            progress += buffLength;
                            DataTransmitted data = new DataTransmitted(progress, contentLength);
                            publishProgress(data);
                        }
                        catch (InterruptedException ex) {
                            Log.e(this.getClass().getName(), ex.getMessage());
                        }
                    }

                }
                else {
                    throw new IOException("No response.");
                }

            }
            catch (MalformedURLException ex) {
                Log.e(this.getClass().getName(), ex.getMessage());
            }
            catch (IOException ex) {
                Log.e(this.getClass().getName(), ex.getMessage());
            }
            return inputStream;
        }

      @Override
        protected void onProgressUpdate(DataTransmitted... data) {

            progressDialog.setProgress(data[0].getProgress());
            progressDialog.setMessage(data[0].getProgress() + " bytes downloaded.");
            data[0] = null;
        }


        @Override
        protected void onPostExecute(InputStream inStream) {
            progressDialog.dismiss();
            progressDialog.setProgress(0);
            DownloadedStream.inputStream = inStream;
            DownloadedStream.test = "Toto je len test...";
            Thread.currentThread().interrupt();
            downloadTask = null;
            new AlertDialog.Builder(DownloadPictureActivity.this)
                .setTitle("Download finished")
                .setMessage("Picture was downloaded correctly.")
                .setPositiveButton("Zobraziť", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dlg, int whichButton) {
                        // body of method

                    }
                })
                .setNegativeButton("Zavrieť", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dlg, int whichButton) {
                     //body of method   
                    } 
                })
                .show();
        }
}

Надеюсь, поможет!

1

Используйте aynctask или отдельный поток для извлечения данных на сервере, пока индикатор выполнения работает в потоке ui.

1

Вы можете использовать AsyncTask<> для достижения этой цели. Вы можете узнать больше по адресу: http://www.vogella.com/articles/AndroidPerformance/article.html

Поток вашей идеи может быть следующим:

  1. начать всплеск активности с индикатором выполнения.
  2. Внутри onCreate() запустите свой AsyncTask для извлечения JSON и обновите onProgressUpdate() прогресса в функции onProgressUpdate() вашего AsyncTask.
    • Когда AsyncTask завершена [ onPostExecute(..) ], вызовите функцию для разбора JSON и проверьте значения true/false
    • если true повторите задачу снова.
    • если false, остановите AsyncTask.
  3. Теперь задание на выбор URL завершено, и вы можете перейти к следующему действию.

Вы также можете использовать настроенный ProgressDialog.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню