如何解决从Android中Service类的线程访问Activity上的UI组件
|| 我有一个由MyService命名的类,该类在下面扩展了Service。一切都会跑到 我在Thread的run方法中删除了“ 0”行。 为什么?以及如何从Thread类的run方法访问Activity组件?public class MyService extends Service {
@Override
public IBinder onBind(Intent intent) { return null; }
@Override
public void onCreate() {
Toast.makeText(this,\"This msg will be shown\",Toast.LENGTH_LONG).show();
Log.d(\"Bilgi\",\"This msg will be shown.\");
super.onCreate();
}
@Override
public void onStart(Intent intent,int startId) {
Toast.makeText(this,Toast.LENGTH_LONG).show();
super.onStart(intent,startId);
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
try {
Log.d(\"This msg will \",\"be shown\"); //if I remove next line
Toast.makeText(this,\"This msg will NOT be shown\",Toast.LENGTH_LONG).show();
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},5000,8000);
}
解决方法
以及如何从Thread类的run方法访问Activity组件?
你不知道使用
Messenger
将来自服务的Message
个对象发送到活动的Handler
。活动-以及仅活动-可以更新其小部件,并且只能从主应用程序线程中进行更新。
这是一个演示此情况的示例应用程序。
, 不使用线程-使用AyncTasks。另外,您不应该通过线程/任务访问Activity方法/ UI。看一下第一个链接,以了解Activity及其“线程”如何协同工作。
, 我知道的唯一方法是在活动中使用广播接收器,它将捕获您的消息并更新UI或您想要的任何内容。
, 创建Toast时,传入ApplicationContext,您可以通过getApplicationContext()获得它
, UI窗口小部件不是线程安全的,因此除非在Main(UI)线程中,否则您不能更新UI窗口小部件,在这种情况下,禁止在另一个线程中使用Toast
。
您可能需要使用Handler
之类的东西,并使用Messenger
将消息发送到在活动UI线程中创建的处理程序。然后处理方法handleMessage(Message msg)
中的小部件。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。