我在一个线程内进行网络操作,该线程在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();
}
答案 0 :(得分:1)
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();
}
答案 1 :(得分:0)
Thread
不在乎Activity
或其他任何组件的生命周期,除了它正在运行的进程。
您需要自己检查组件的状态。
我可以提供一些示例代码,但我真的不明白您到底想做什么。
考虑到您正在那里发出网络请求。考虑到在响应后我们需要继续使用Main线程更新UI的事实,在这种情况下,单独处理Java线程非常困难。因此,我强烈建议您使用RetroFit网络API库。
您可以像isFinishing()
中的Activity
那样检查组件的状态。