等待 UI 线程在 Android 中完成操作

Posted

技术标签:

【中文标题】等待 UI 线程在 Android 中完成操作【英文标题】:Waiting for UI Thread to finish operation in Android 【发布时间】:2021-10-01 08:51:30 【问题描述】:

我在我的onCreate() 方法中处于这种情况:

@Override
protected void onCreate (Bundle savedInstanceState) 

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_game);

    new Thread(() -> 

        Object obj;

        while (true) 

            // update obj

            runOnUiThread(() -> 
                // display obj
            );

        

    ).start();


这里的问题是更新操作与显示操作不同步:我总是跳过一个值,因为obj 在 UI 线程能够显示其旧值之前更新。

等待 UI 线程完成其显示 obj 的工作然后才进行下一次迭代的正确方法是什么?

【问题讨论】:

我认为您实际上并没有很好地解释您的问题,但通常您不会以这种方式与 UI 线程同步。两个线程都异步地做他们的事情,这很重要。如果你真的认为你需要同步,我认为你需要更好地解释你实际上想要做什么。我认为这里有一个 XY 问题/ 链接到 XY 问题:en.wikipedia.org/wiki/XY_problem 最后我通过在 UI 线程上运行这两个操作来解决它 这几乎肯定是错误的解决方案。相反,您通常应该使用在工作线程完成时执行的 callback @outsidethecave 在 UI 线程上运行这两个操作可能会冻结并导致应用程序崩溃,如果这些操作花费了太长时间才能完成。 【参考方案1】:

您可以在此处使用回调

喜欢,

//Extending the Activity is left here since it isn't the subject
public class MyClass implements MyThread.CallbackListener
    @Override
    protected void onCreate (Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_game);
      
        new MyThread(this).start(); 

        //Your codes that do not require synchronization with the above thread
    
 
    @Override
    public void onObjectUpdated(Object obj)
        //Your code that needs to be synchronized. In your case display your object here
    

你的 MyThread 类将是

public class MyThread extends Thread
    Object obj;
    CallbackListener listener; 
   
    public MyThread(CallbackListener listener)
        this.listener = listener;
      
    
    public void run()
       while (true) 
          // update obj
          listener.onObjectUpdated(obj);
       
    

    public interface CallbackListener
       void onObjectUpdated(Object obj);
     

我们在这里所做的只是在对象更新时进行方法调用。

当对象更新时,您的 MyClass 中的 onObjectUpdated 方法将被调用,从而使您的代码同步。并且您可以将任何非同步代码放在 onCreate 方法本身中。

【讨论】:

以上是关于等待 UI 线程在 Android 中完成操作的主要内容,如果未能解决你的问题,请参考以下文章

Android 线程交互

Android activity等待service数据后再执行

Android系统消息处理机制

Android系统消息处理机制

Android onHandleIntent IntentService 等待 UI 线程

Android消息机制