Android 由于活动已被破坏,如何在长时间任务后与活动通信
我已经创建了带有登录功能的简单应用程序。我已经为登录到名为Android 由于活动已被破坏,如何在长时间任务后与活动通信,android,android-activity,android-fragments,Android,Android Activity,Android Fragments,我已经创建了带有登录功能的简单应用程序。我已经为登录到名为LoginTask的服务器和名为LoginListener的侦听器类创建了单独的任务 public interface LoginListener { public void onLoginComplete(); public void onLoginFailure(String msg); } public class LoginTask extends AsyncTask<String, Void, Boole
LoginTask
的服务器和名为LoginListener
的侦听器类创建了单独的任务
public interface LoginListener {
public void onLoginComplete();
public void onLoginFailure(String msg);
}
public class LoginTask extends AsyncTask<String, Void, Boolean>{
private final LoginListener listener;
private final Context c;
private String msg;
public LoginTask(final Context c, final LoginListener listener) {
this.c = c;
this.listener = listener;
}
@Override
protected Boolean doInBackground(String... args) {
// loging in to server
//return true if success
}
@Override
protected void onPostExecute(Boolean status) {
if(!status){
if(listener != null) listener.onLoginFailure(msg);
return;
}
// the problem is here, listener is null, because activity/fragment destroyed
if(listener != null) listener.onLoginComplete();
}
}
由于登录任务需要时间,有时设备指示灯在任务完成前关闭,因此活动被破坏。这导致任务无法调用侦听器(片段)。如何解决这个问题
感谢onLoginComplete和onLoginFailure中的,请检查片段是否仍然附加到活动。如果没有,什么也不做
@Override
public void onLoginComplete() {
if (isAdded() && !isRemoving() && !isDetached()) {
((MainActivity)getActivity()).gotoMain();
}
}
在onLoginComplete和onLoginFailure中,检查片段是否仍然附加到活动。如果没有,什么也不做
@Override
public void onLoginComplete() {
if (isAdded() && !isRemoving() && !isDetached()) {
((MainActivity)getActivity()).gotoMain();
}
}
您可以取消LoginActivity的onDestroy()中的asynctask 重写asynctask的onCancelled()。当活动被销毁时,将调用onCancelled()而不是onPostExecute()
在这里,您可以避免对LoginActivity的回调。您可以取消LoginActivity的onDestroy()中的asynctask 重写asynctask的onCancelled()。当活动被销毁时,将调用onCancelled()而不是onPostExecute()
在这里,您可以避免调用LoginActivity。
AsyncTask
应用于需要更长时间并将结果返回到当前活动中的任务。但是,它并不用于真正长时间运行的任务,也不适用于那些即使在活动被破坏的情况下也要评估其结果的情况。您可以考虑使用<代码>服务<代码>。在任何情况下,您都不应该再在
onPostExecute()
中执行更新,因为活动上下文可能会消失(请参阅DoctorDrive的帖子) 安装该服务后,您可以向系统发送意图
或广播
事件。然后在该意图活动/广播接收器中执行进一步处理。AsyncTask
应用于耗时稍长的任务,并将结果返回到当前活动中。但是,它并不用于真正长时间运行的任务,也不适用于那些即使在活动被破坏的情况下也要评估其结果的情况。您可以考虑使用<代码>服务<代码>。在任何情况下,您都不应该再在
onPostExecute()
中执行更新,因为活动上下文可能会消失(请参阅DoctorDrive的帖子) 安装该服务后,您可以向系统发送意图
或广播
事件。然后在该意图活动/广播接收器中进行进一步处理。您应该使用服务或意图服务。因为AsyncTask
不记录活动的任何变量或上下文。完成登录任务后,启动pendingent
或startActivity(intent)
。这可能是Android的最佳实践。这样您就不会出现异常。您应该使用Service
或IntentService
。因为AsyncTask
不记录活动的任何变量或上下文。完成登录任务后,启动pendingent
或startActivity(intent)
。这可能是Android的最佳实践。这样你就不会出现异常。Hmm,我需要调用((MainActivity)getActivity()).gotoMain()代码>,如何执行?当活动被销毁时会出现问题,如何调用((MainActivity)getActivity()).gotoMain()代码>?如果活动被销毁,您将无法再从片段引用它,因为它已分离,并且可能会创建新的片段实例,并且当前的片段实例将丢失。你需要改变你的行为。如果活动按照Arun的回答被破坏,您可以取消登录。嗯,我需要调用((MainActivity)getActivity()).gotoMain()代码>,如何执行?当活动被销毁时会出现问题,如何调用((MainActivity)getActivity()).gotoMain()代码>?如果活动被销毁,您将无法再从片段引用它,因为它已分离,并且可能会创建新的片段实例,并且当前的片段实例将丢失。你需要改变你的行为。如果活动按照Arun的回答中的建议被破坏,您可以取消登录。