2012-12-18 82 views
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); 

我檢查了日誌,但沒有處理消息,因此看起來我的計劃不起作用。每次我的服務完成其工作時,我都想更新文本字段。

回答

0

在你的情況shoild使用廣播接收器是這樣的:

在你的Activity類定義接收器:在您的onCreate或OnStart方法

public class DataUpdateReceiver extends BroadcastReceiver { 

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

你必須註冊接收器:

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

在您的服務上加上:

public static final String REFRESH_DATA_INTENT = "done"; 

,當你完成了所有的工作人員必須發送brocast這樣的:

sendBroadcast(new Intent(MainService.REFRESH_DATA_INTENT)); 
+0

感謝這真的幫助,我可以再次在視圖中做一些東西,並更新我的文本字段 –

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)將是一個錯誤。

0

你想要做什麼?我真的沒有看到在活動中實例化Handler的意義,因爲你所做的只是從MessageQueue獲取消息。你當然不想與Android發佈的任何消息混在一起,並且有更好的方式發送消息給Activity。

當然,您不包含AttachApplication的代碼,所以我只能推測。

您還試圖從服務訪問此處理程序。事情正在發生,但我不知道是什麼。

如果您想在每次服務完成其工作時更新TextView,請將廣播Intent從服務發送到活動,並在活動中使用廣播接收器。您還應該考慮使用IntentService而不是服務。

相關問題