Java 处理程序在没有活动的情况下返回?

Java 处理程序在没有活动的情况下返回?,java,android,Java,Android,我正在使用处理程序在线程返回后更新UI-以下是从线程运行的方法(在片段中) 这很好,但是如果我在正确的时间旋转手机,在创建活动之前就会调用处理程序,因此getActivity()返回null,应用程序就会崩溃。我不能只将方法包装在if(getActivity()!=null)中,否则它根本不会更新UI 解决这个问题的最佳方法是什么?安卓系统有什么我可以用来解决这个问题的吗 谢谢 凯文 编辑 因此,我实施了下面一个似乎有效的回答。在应用程序类中使用静态上下文引用: 我不确定使用这个的细节,所以我有

我正在使用处理程序在线程返回后更新UI-以下是从线程运行的方法(在片段中)

这很好,但是如果我在正确的时间旋转手机,在创建活动之前就会调用处理程序,因此getActivity()返回null,应用程序就会崩溃。我不能只将方法包装在if(getActivity()!=null)中,否则它根本不会更新UI

解决这个问题的最佳方法是什么?安卓系统有什么我可以用来解决这个问题的吗

谢谢

凯文

编辑

因此,我实施了下面一个似乎有效的回答。在应用程序类中使用静态上下文引用:


我不确定使用这个的细节,所以我有点犹豫-我可能会发布另一个问题,看看这是否有问题

使用此选项获取活套:

Looper mainLooper = Looper.getMainLooper();
它对我有用

编辑:
Looper.getMainLooper()
返回UI线程(主线程)的循环器

编辑2:
您可以在视图中使用
getContext()
来获取上下文。

您可以使用getApplicationContext()来为Toast获取合适的上下文。但是,您可以访问的方法受到此代码执行位置的限制

编辑:

我很难理解你的方法论。你为什么拒绝这样做:

public void signedIn(boolean success, String error) {
    if(success){
        Toast.makeText(getActivity(), "Signed In!",
            Toast.LENGTH_SHORT).show();
    } 
    else{
        Toast.makeText(getActivity(), "Failed!" + error,
            Toast.LENGTH_SHORT).show();
    }
}
使其与runnable异步会创建一个潜在的竞争条件来访问活动实例。对于一个简单的展示祝酒词的任务来说,这似乎是完全不必要的复杂性

此外,由于布尔值只能处于两种状态之一,因此不需要
else if
子句

还要更改此方法的名称,以便更好地与Java命名约定保持一致。“signedIn”应该是返回用户是否已签名的方法的名称。

作为回答,您可以查看处理与轮换相关的应用程序配置更改的最佳做法。处理此问题的最佳方法是使用
setRetainInstance(true)
创建一个片段,以保留对正在进行的任务的引用

这是必要的,因为当您旋转屏幕时,Android会破坏您当前的活动(甚至调用onDestroy方法),并使用新配置创建一个新的活动。这样,您可以知道任务何时完成,并对尚未创建的活动运行UI操作

编辑


如果上下文为null,则片段任务不应推送结果,而应存储它。重新加载活动时,将调用其onCreate。因为您使用了一个任务片段,所以您将能够检索片段实例并知道此任务是否已完成。活动应该做的唯一一件事是根据已经完成的片段任务恢复其新状态。

我刚刚尝试了这个,它似乎起作用了!至少在我需要使用Activitys上下文来更新任何UI元素之前——例如,我的Toast现在出现了错误,但在更现实的情况下,我会更新进度微调器并更改一些片段,所有这些我都需要上下文来做吗?有什么想法吗?是的。可能使用上下文参数创建构造函数?请参阅edit2。您可以在视图上使用getContext方法来获取上下文。什么的构造函数?当上下文为空时,将上下文传递给某个对象会有什么帮助?请参阅我的答案中的edit2。也许您可以设置应用程序上下文?看看这个答案:你可以在任何上下文中创建祝酒词。(申请、活动、服务、广播接收者)谢谢你。我在代码中实现了工作程序片段,以确保任务独立运行。然而,我不认为这是解决我问题的正确方法。我的问题是当回到UI线程时,我不能简单地等待活动,所以我现在无法获取上下文。是的,你可以。不要将更改推送到活动,而是等待活动自己获得更改。我将编辑我的答案。我从哪里获取应用程序上下文,我不能调用getActivity().getApplicationContext,因为该活动为空。我有误解。我没有仔细阅读你的代码。
public void signedIn(boolean success, String error) {
    if(success){
        Toast.makeText(getActivity(), "Signed In!",
            Toast.LENGTH_SHORT).show();
    } 
    else{
        Toast.makeText(getActivity(), "Failed!" + error,
            Toast.LENGTH_SHORT).show();
    }
}