从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)
中的小部件。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...