在以下代码中runOnUiThread如何在不影响现有UI线程的情况下工作

时间:2018-07-04 09:44:07

标签: android multithreading

在以下代码中
我们使用 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(){

            }
        })
    }
})

7 个答案:

答案 0 :(得分:2)

Android中有两种类型的线程。

1 UI或主线程,在其上呈现UI元素(布局)。

2 工作者线程,应在其中执行长任务(例如AsyncTask和网络)。

如果您在new Thread中编写某些任务,则意味着该任务将在工作线程中执行。

现在,您将使用runOnUiThreadnew 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组件的标准方法之一。

此外,runOnUiThreadActivity类的方法,它在UI线程上运行指定的操作。如果当前线程是UI线程,则立即执行该操作。如果当前线程不是UI线程,则将操作发布到UI线程的事件队列。

另一种标准方式是使用HandlerMessage,如Android Developer在此处https://developer.android.com/training/multiple-threads/communicate-ui

所正式记录的那样。

答案 6 :(得分:0)

  

这不是现有UI线程会造成的问题

一点也不。您说“现有的UI线程” 。只有一个UI线程。 runOnUiThread()仅将可运行对象添加到UI线程一个一执行的任务队列中。您可以检查doc