线程运行在活动生命周期之后?

时间:2019-07-10 10:04:46

标签: android multithreading activity-lifecycle

我在一个线程内进行网络操作,该线程在oncreate()中基于网络响应,我需要处理下一步,但是该线程在活动生命周期之后运行。

我在活动的oncreate()中调用了networkRequest()

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 个答案:

答案 0 :(得分:1)

  

Thread没有与活动绑定。它不在主线程上运行。

Android说,如果您想执行任何长时间运行的任务,例如api calldata from database,则需要使用AsyncTaskService

根据您的情况,您可以使用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();
}

答案 1 :(得分:0)

  

Thread不在乎Activity或其他任何组件的生命周期,除了它正在运行的进程。

您需要自己检查组件的状态。 我可以提供一些示例代码,但我真的不明白您到底想做什么。

考虑到您正在那里发出网络请求。考虑到在响应后我们需要继续使用Main线程更新UI的事实,在这种情况下,单独处理Java线程非常困难。因此,我强烈建议您使用RetroFit网络API库。
您可以像isFinishing()中的Activity那样检查组件的状态。