0

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

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 );

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

4

3 回答 3

0

在您的情况下,您应该像这样使用 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));
于 2012-12-18T21:01:31.047 回答
0

你的代码片段说public void handlerMessage(Message msg),但我认为你public void handleMessage(Message msg)的意思是,没有r. 当您打算覆盖超类中的方法时,可以使用@Override 标签来避免这些问题;所以你的代码片段会被渲染@Override public void handleMessage(Message msg),而@Override public void handlerMessage(Message msg)会是一个错误。

于 2012-12-18T21:02:45.270 回答
0

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

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

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

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

于 2012-12-18T21:02:48.753 回答