在以下代码中
我们使用 runOnUiThread 的方式
现有的UI线程不会造成此问题
因此在应用程序中造成了问题,因此不应该使用
Thread thread = new Thread(new Runnable(){
@Override
public void run(){
//what is meant by the inside code of this run(), how is this updating the UI
runOnUiThread(new Runnable(){
@Override
public void run(){
}
})
}
})
答案 0 :(得分:2)
Android中有两种类型的线程。
1 是 UI或主线程,在其上呈现UI元素(布局)。
2 是工作者线程,应在其中执行长任务(例如AsyncTask和网络)。
如果您在new Thread
中编写某些任务,则意味着该任务将在工作线程中执行。
现在,您将使用runOnUiThread
或new Handler(Looper.getMainLooper())
,因为您无法触摸辅助线程中的UI元素。
因此,基本上,当您更新setText()
或Toast
之类的UI或任何UI操作时,您将必须使用UI线程,并且应使用工作线程做一些长时间的处决。
修改
通常,我们不必在Android中管理线程。因为我们使用的所有库都很聪明。尽管在某些情况下,我们也必须管理线程。
示例
假定您要在新的Thread
中调用网络服务(api),现在当响应到来时,您要显示Toast
。如果您只是直接在工作人员Toast.show...
内部写Thread
作为响应,则会出现异常。
只有创建视图层次结构的原始线程可以触摸其视图。
现在要解决此问题,您必须使用runOnUiThread
,以便显示Toast
。
答案 1 :(得分:2)
在android中,对于长时间运行的任务,您应使用单独的线程,例如AsyncTask()
或service。假设您要像要向用户显示Toast一样更新UI,则应编写runOnUiThread()
,因为只有UI线程才允许触摸UI组件。
getActivity().runOnUiThread(new Runnable()
{
@Override
public void run() {
Toast.makeText(getContext(), "API calling done!!", Toast.LENGTH_LONG).show();
}
});
答案 2 :(得分:1)
只要我们有Long running tasks
,我们就会切换到worker threads
,避免使用Main Thread
,从而使用户体验更加流畅,并避免ANR。
但是,
to update the UI
时间到了,我们必须“返回”到Main Thread
,因为只有Main Thread
被允许触摸和更新应用程序 用户界面。
我们可以通过调用Activity’s runOnUiThread()
方法来实现:
runOnUiThread()
的基本用途是-运行指定的操作 在UI线程上。它将检查当前线程,如果找到了它 MainThread它将立即执行该任务,否则首先执行 它将切换到应用程序MainThread,然后执行 给定任务。
答案 3 :(得分:0)
创建并执行新的Thread
时,它将在后台线程中执行任务。但是方法runOnUiThread()
用于在主UI线程上运行代码。
在您的代码中,调用runOnUiThread()
方法,因此您可以从另一个线程更新UI线程。
答案 4 :(得分:0)
当线程在方法runOnUiThread ()
中运行时,将更新UI组件(textview等)。
通过调用runOnUiThread
,您也可以更新状态
答案 5 :(得分:0)
不用担心!这是从单独的线程甚至在Android平台上的UI线程本身上更新UI组件的标准方法之一。
此外,runOnUiThread
是Activity
类的方法,它在UI线程上运行指定的操作。如果当前线程是UI线程,则立即执行该操作。如果当前线程不是UI线程,则将操作发布到UI线程的事件队列。
另一种标准方式是使用Handler
和Message
,如Android Developer在此处https://developer.android.com/training/multiple-threads/communicate-ui
答案 6 :(得分:0)
这不是现有UI线程会造成的问题
一点也不。您说“现有的UI线程” 。只有一个UI线程。 runOnUiThread()
仅将可运行对象添加到UI线程一个一执行的任务队列中。您可以检查doc。