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的回答中的建议被破坏,您可以取消登录。