java - 如何从非 ui Widget 线程发布 toast

标签 java android multithreading widget

我试图在小部件中的非 UI 线程调用函数后发布 toast 。我已经阅读了多种执行此操作的方法(发布/新处理程序/广播),但大多数方法似乎都是针对 Activity 而不是小部件类,并且我无法让任何方法工作。

我下面有一些基本代码...任何人都可以告诉我做我需要做的事情的最佳方法,也许提供一个例子...谢谢(显然我已经删除了所有不必要的部分...

我知道你不能在小部件中使用 runOnUiThread 但基本上做我想做的事情的最佳方法是什么???

提前致谢

public class MyWidget extends AppWidgetProvider {

@Override
public void onReceive(final Context context, Intent intent) {
    super.onReceive(context, intent);
            new Thread(new Runnable() {
                public void run() {
                        DoStuff();
                }
            }).start();
}

 public void DoStuff () {

      //do a load of stuff on the non UI thread which might take some time and return a string

    String mymessage = "amessage"

    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            Toast.makeText(context, mymessage, Toast.LENGTH_SHORT).show();
        }
    });


 }

}

最佳答案

您可以创建自己的 runOnUiThread() 版本。当我需要从 Activity 外部在 UI 线程中运行某些内容时,我会使用以下方法:

public final class ThreadPool {
    private static Handler sUiThreadHandler;

    private ThreadPool() {
    }

    /**
     * Run the {@code Runnable} on the UI main thread.
     *
     * @param runnable the runnable
     */
    public static void runOnUiThread(Runnable runnable) {
        if (sUiThreadHandler == null) {
            sUiThreadHandler = new Handler(Looper.getMainLooper());
        }
        sUiThreadHandler.post(runnable);
    }

    // Other, unrelated methods...
}

然后,您只需调用ThreadPool.runOnUiThread(runnable)即可。

您可以在本系列文章中找到有关其工作原理的更多信息:Android: Looper, Handler, HandlerThread. Part I

关于java - 如何从非 ui Widget 线程发布 toast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39917308/

相关文章:

java - 如何将 SQLite 数据库数据传递给 Activity 并为该数据增值?

java - 我有一个带有一些格式的跨文本。如何根据该格式将其转换为字符串?

java - 如何使用阻塞队列在后台处理摄像头源?

c# - 使用线程安全的 .NET 4+ 集合时是否可能导致死锁?

java - 如何启用模式验证以便 JAXB 拒绝空元素?

java - Hibernate:是否可以只保留一个 child ,这也会导致 parent 的坚持

java - 从Java中的相对路径读取.txt文件

android - Flutter 的可重用组件

C++ 11 - 当我将局部变量作为参数传递给线程时是否安全

java - 在 StringTokenizer 中有条件地添加字符串