Тема запускается после жизненного цикла активности? - PullRequest
0 голосов
/ 10 июля 2019

У меня есть сетевая операция внутри потока, которая в oncreate() основана на ответе сети. Мне нужно обработать следующий шаг, но поток работает после жизненного цикла действия.

Я вызвал networkRequest () в oncreate () в действии

private void networkRequest() {

 final String[] resp = new String[1];
 Thread thread = new Thread(new Runnable() {
  @Override
  public void run() {
   try {
    resp[0] = AttemptingUploadCheckList.getJsonObj(url);
    JSONObject response = new JSONObject(resp[0]);

    if (response != null) {
     version_code = response.getInt("version_code");
     recommended_update = response.getBoolean("recommended_update");
     forced_update = response.getBoolean("forced_update");
    }
    if (recommended_update) {
     recomendUpadate();
    } else if (forced_update)
     onUpdateNeeded(url);
    else {
     Intent intent = new Intent(SplashActivity.this, LoginActivity.class);
     startActivity(intent);
     finish();
    }

   } catch (Exception e) {
    e.printStackTrace();
   }
  }
 });
 thread.start();
}

Ответы [ 2 ]

1 голос
/ 10 июля 2019

Thread не связан с деятельностью. Он не работает с основным потоком.

Android сказал, что если вы хотите выполнять какие-либо длительные задачи, такие как api call, data from database, то вам нужно использовать AsyncTask или Service .

В вашем случае вы можете использовать AsycnTask для извлечения данных.

class MyAsync extends AsyncTask<Void, Void, Void>{
        final String[] resp = new String[1];
        JSONObject response;
        @Override
        protected void onPreExecute() {
            super.onPreExecute();

            // Show Progress Dialog
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);

            // Hide Progress Dialog

            if (response != null) {
                version_code = response.getInt("version_code");
                recommended_update = response.getBoolean("recommended_update");
                forced_update = response.getBoolean("forced_update");
            }
            if (recommended_update) {
                recomendUpadate();
            } else if (forced_update)
                onUpdateNeeded(url);
            else {
                Intent intent = new Intent(SplashActivity.this, LoginActivity.class);
                startActivity(intent);
                finish();
            }
        }

        @Override
        protected Void doInBackground(Void... voids) {

                        try {
                            resp[0] = AttemptingUploadCheckList.getJsonObj(url);
                            response = new JSONObject(resp[0]);

                        } catch (Exception e) {
                            e.printStackTrace();
                        }

            return null;
        }
    }

Для выполнения вышеуказанного AsynTask

private void networkRequest() {
       new MyAsync().execute();
}
0 голосов
/ 10 июля 2019

Thread не заботится о Activity или о жизненном цикле любого другого компонента, кроме процесса, в котором он выполняется.

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

Учитывая, что вы делаете там сетевой запрос. В таких случаях отдельный поток Java трудно обрабатывать, учитывая тот факт, что после ответа нам нужно перейти к основному потоку для обновления пользовательского интерфейса. Поэтому я настоятельно рекомендую вам использовать библиотеку сетевого API, вероятно RetroFit .
Вы можете проверить состояние компонента как isFinishing() в Activity.

...