gpt4 book ai didi

android - 在线程中的小部件中显示 Toast

转载 作者:行者123 更新时间:2023-11-30 03:45:21 25 4
gpt4 key购买 nike

我必须开发一个包含按钮的小部件 (AppWidget)。当按下按钮时,http 请求完成,如果请求成功,小部件将通过 Toast 通知事实。由于http请求可以锁定UI,所以我在一个线程中运行。一切正常(我可以在我的登录中看到“一切正常”),除了 Toast 通知。我做错了什么?

在 AppWidgetProvider 子类中:

@Override
public void onReceive(Context c, Intent intent){
super.onReceive(c, intent);
if(intent.getAction().equals(CLICK_ACTION)){
performRequest(c);
}
}

(我认为这个问题不需要onUpdate方法)

private void performRequest(final Context c){
new Thread(new Runnable(){
public void run() {
try {
if(Http.get(URL).contains(SUCCESS)){
Toast.makeText(c, "All right", Toast.LENGTH_SHORT).show();
Log.i("Widget","All right");
}
} catch (Exception e) {
e.printStackTrace();
}}}).start();
}

我认为问题出在 performRequestContext 参数上,但是如果我删除 final 关键字,我就会出错。

谢谢你的建议。

[编辑]

我这样“解决”了问题:

-我将Toast t声明为一个全局变量;

-在 onReceive 方法中,我用 Toast.makeText(Context,String,int)

初始化它

-当我需要显示它时,我只需调用t.show()

希望有更好的解决方案。

最佳答案

Since the http request can lock the UI, I run it in a thread. All it's working fine (I can view "All right" in my logat), except for the Toast notification. What am I doing wrong?

问题是您不能从另一个线程更改 UI。您必须将此消息传递回主线程才能显示您的 Toast。


How can I do it?

有很多不同的方法可以做到这一点,尝试将 onReceive() 中的 Context 保存为字段变量:

Context context;

@Override
public void onReceive(Context c, Intent intent){
super.onReceive(c, intent);
context = c;
...

接下来在您的 Activity 中创建一个简单的方法:

public void httpGetSucceeded() {
Toast.makeText(context, "All right", Toast.LENGTH_SHORT).show();
Log.i("Widget","All right");
}

现在在你的 Runnable 中调用它:

try {
if(Http.get(URL).contains(SUCCESS)){
httpGetSucceeded();
}
} //etc

关于android - 在线程中的小部件中显示 Toast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15101958/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com