我试图从小部件中的非UI线程调用函数后发布祝酒词。我已经阅读了多种执行此操作的方法(发布/新处理程序/广播),但是大多数方法似乎都是针对活动而不是窗口小部件类,因此我无法使用任何方法。

我在下面有一些基本代码...谁能告诉我做我需要做的最好方法,也许还提供一个示例...谢谢(显然,我已经删除了所有不必要的内容...

我知道您不能在小部件中使用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

10-08 01:55