我试图在窗口小部件中的非UI线程调用函数后发布一个toast。我已经阅读了多种方法(post / new handler / broadcast),但大多数方法似乎都是针对活动而不是widget类,我无法工作。
我在下面有一些基本代码......任何人都可以告诉我做我需要做的最好的方法,并提供一个例子......谢谢(显然我已经拿走了所有不必要的东西......
我知道你不能在小部件中使用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();
}
});
}
}
答案 0 :(得分:2)
您可以创建自己的runOnUiThread()版本。这是我在需要在活动外部的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
答案 1 :(得分:0)
if(Looper.myLooper()== null){
Looper.getMainLooper();
}
Looper.prepare();
new Handler()。post(new Runnable(){
@Override
public void run() {
Toast.makeText(LargeAppWidget.this.context, "Sample Text", Toast.LENGTH_SHORT).show();
}
});
Looper.loop();
不建议使用looper。