Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 后台线程中的UI更改_Android_Kotlin - Fatal编程技术网

Android 后台线程中的UI更改

Android 后台线程中的UI更改,android,kotlin,Android,Kotlin,我有一个函数,这个函数在后台线程中发送http请求 当请求被执行并完成时,我有一些代码行进行UI更改,但是当片段暂停时,应用程序崩溃,因为当片段暂停时,函数无法进行UI更改,我现在不知道我必须做什么来解决这个问题 val url = "BASE_DIR/example" val client = OkHttpClient() val request = Request.Builder().url(url).build() val code =

我有一个函数,这个函数在后台线程中发送http请求 当请求被执行并完成时,我有一些代码行进行UI更改,但是当片段暂停时,应用程序崩溃,因为当片段暂停时,函数无法进行UI更改,我现在不知道我必须做什么来解决这个问题

    val url = "BASE_DIR/example"
    val client = OkHttpClient()
    val request = Request.Builder().url(url).build()

    val code = client.newCall(request).execute().code()

    if (code == 200) {
        
        fragment.requireActivity().runOnUiThread { 
            fragment.refresh.isRefreshing = false
        }
试一试

fragment.getActivity()?.runOnUiThread { 
            fragment.refresh?.isRefreshing = false
        }
问题是碎片何时被分离

将抛出
非法状态异常
,因为它与任何
活动
都没有关联,但是
getActivity()
如果它与任何
活动
都没有关联,则返回null,因此使用null safe调用可以安全地执行此操作。

尝试使用

fragment.getActivity()?.runOnUiThread { 
            fragment.refresh?.isRefreshing = false
        }
问题是碎片何时被分离


将抛出
IllegalStateException
,因为它不与任何
活动关联,但是
getActivity()
如果它不与任何
活动关联,则返回null,因此使用null safe调用可以安全地执行此操作。

向UI线程发送消息的另一种方法是使用
处理程序

Handler(Looper.getMainLooper()).post {
    // do whatever
}
或者您有常用的
postDelayed
方法等。因此,您可以更新
片段
,而无需将其附加到
活动
,这可能比仅对
getActivity
执行空检查要好(片段可能只是暂时分离,因此您仍然希望更新其状态,这样您就不需要了)“失去”结果)


如果您不介意丢失结果,因为您将分离的片段视为死片段,因此不需要更新,那么@rahat的答案中的空检查是最简单的方法。不要使其变得比需要的更复杂!

另一种向UI线程发送消息的方法是使用
处理程序

Handler(Looper.getMainLooper()).post {
    // do whatever
}
或者您有常用的
postDelayed
方法等。因此,您可以更新
片段
,而无需将其附加到
活动
,这可能比仅对
getActivity
执行空检查要好(片段可能只是暂时分离,因此您仍然希望更新其状态,因此您不需要”失去“结果”)


如果您不介意丢失结果,因为您将分离的片段视为死片段,因此不需要更新,那么@rahat的答案中的null检查是最简单的方法。不要让它变得比需要的更复杂!

我尝试了这个方法,但我得到了一个异常:java.lang.NullPointerException:尝试调用virt空对象引用上的ual方法“android.view.view android.view.view.findViewById(int)”->当导航到函数finishi之前的另一个片段时会发生尝试此操作,但我遇到以下异常:java.lang.NullPointerException:尝试调用虚拟方法“android.view.view android.view.view.view.findViewById(int)'在空对象引用上->在函数finishjava.lang.NullPointerException之前导航到另一个片段时发生异常:尝试在空对象引用上调用虚拟方法'android.view.view.findViewById(int)'->在片段暂停时我遇到了此异常:(这与您在这里所做的无关(或您发布的代码)!您正在一个不再存在的
视图上执行
findViewById
-在
onCreate
(或
onCreateView
)中执行此操作并将其分配给一个变量,或者对
view?.findViewById
使用null安全设置,并在对其执行任何操作之前对结果进行null检查谢谢我解决了它java.lang.NullPointerException:尝试调用虚拟方法'android.view.view.android.view.view.findViewById(int)'在一个空对象引用上->我在片段暂停时遇到了这个异常:(这与你在这里做的事情(或你发布的代码)无关)!你在一个不再存在的
视图上做
findViewById
-或者在
onCreate
中做它(或者
onCreateView
)并将其分配给变量,或在
view?中使用空安全性。findViewById
和空检查结果,然后再对其执行任何操作谢谢我解决它