Android 后台线程中的UI更改
我有一个函数,这个函数在后台线程中发送http请求 当请求被执行并完成时,我有一些代码行进行UI更改,但是当片段暂停时,应用程序崩溃,因为当片段暂停时,函数无法进行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 =
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
和空检查结果,然后再对其执行任何操作谢谢我解决它