【问题标题】:Handler will not be called in my activity在我的活动中不会调用处理程序
【发布时间】:2012-12-18 20:35:37
【问题描述】:

我在我的活动中创建了一个处理程序。处理程序将存储在应用程序对象中。

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.action_activity);
    appData = (AttachApplication) getApplication();

    Handler updateHandler = new Handler() {
        public void handlerMessage(Message msg) {
            Log.d( TAG, "handle message " );
        }
    };
    appData.setUpdateHandler( updateHandler );


}

我的计划是当我在我的服务中 setEmtpyMessage 时将调用这个 handleMessage。该服务从应用程序对象中检索处理程序。

public int onStartCommand(Intent intent, int flags, int startId) {
    Log.d(TAG, "onStartCommand of attachService");
    List<Job> jobList = DBManager.getInstance().getAllOpenJobs();
    appData = (AttachApplication) getApplication();
    updateHandler = appData.getUpdateHandler();
            updateHandler.sendEmptyMessage( 101 );

我检查了日志,但没有句柄消息,因此我的计划似乎行不通。我想在每次我的服务完成工作时更新一个文本字段。

【问题讨论】:

    标签: android android-service android-handler


    【解决方案1】:

    在你的情况下,你应该像这样使用 BroadcastReceiver:

    在您的 Activity 类中定义接收器:

    public class DataUpdateReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(MainService.REFRESH_DATA_INTENT)) {
                            //do something
            }
        }
    }
    

    在你的 onCreate 或 onStart 方法上你必须注册接收者:

    DataUpdateReceiver dataUpdateReceiver = new DataUpdateReceiver();
    IntentFilter intentFilter = new IntentFilter(MainService.REFRESH_DATA_INTENT);
    registerReceiver(dataUpdateReceiver, intentFilter);
    

    在你的服务上添加这个:

    public static final String REFRESH_DATA_INTENT = "done";
    

    当你完成所有工作人员后,你必须像这样发送广播:

    sendBroadcast(new Intent(MainService.REFRESH_DATA_INTENT));
    

    【讨论】:

    • 感谢这真的很有帮助,我可以再次在视图中做一些事情并更新我的文本字段
    【解决方案2】:

    您的代码 sn-p 表示 public void handlerMessage(Message msg),但我认为您的意思是 public void handleMessage(Message msg),没有 r。当您打算覆盖超类中的方法时,可以使用@Override 标签来避免这些问题;所以你的 sn-p 将被呈现为@Override public void handleMessage(Message msg),而@Override public void handlerMessage(Message msg) 将是一个错误。

    【讨论】:

      【解决方案3】:

      你想做什么?我真的看不出在 Activity 中实例化 Handler 的意义,因为您所做的只是从 MessageQueue 中获取消息。您当然不想与 Android 发布的任何消息混为一谈,而且还有更好的方法可以向 Activity 发送消息。

      当然,你没有包含AttachApplication的代码,所以我只能推测。

      您还尝试从服务访问此处理程序。发生了一些事情,但我不确定是什么。

      如果您想在每次 Service 完成工作时更新 TextView,请从 Service 向 Activity 发送广播 Intent,并在 Activity 中使用广播接收器。您还应该考虑使用 IntentService 而不是 Service。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-10
        • 1970-01-01
        • 2011-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多