当我在service和handler.post方法中运行东西时,为什么我的Activity仍然落后?

时间:2010-11-18 11:56:07

标签: android service handler

我很困惑,为什么我的活动仍然滞后,我使用的方法很少,每个都有自己的工作,如下载内容,流程数据,比较内容等...它将在后台运行并更新数据按选定的时间间隔通知用户通知系统的更改。

远程服务的原因,因为我最终会添加一个小部件,即使android杀死了活动,服务也需要保持运行,所以我在每个onPause()上取消绑定。 但据我所知,这部分不会引起我的问​​题。

但回到我的问题......所以当我在服务和handler.post方法中运行东西时,我的Activity仍然落后。

这是代码:

public class WarnService extends Service {

  private Bitmap pic;
  private boolean dataUpToDate;

  private void loadData(){
    //code that downloads new data and sets the dataUpToDate variable
  }

  private void updateLayer(Bitmap bt){
    //code that updates some stuff if downloaded and local data differ
  }

  private IWarnService.Stub WServiceStub = new IWarnService.Stub() {

    @Override
    public void refreshData() throws RemoteException {
      serviceHandler.post(new Runnable() {

        @Override
        public void run() {
          loadData();
          if(!dataUpToDate){
            updateLayer(pic);
          }
        }
      });   
    }

  }
}

此外,我想在updateLayer(...)中添加progressDialog,通过Activity是该服务的监听器,但是效果不佳。什么是更新progressDialog的最佳方法?永远的倾听者,处理者,意图还是什么?

那我该怎么做呢?

2 个答案:

答案 0 :(得分:1)

如果您的服务在后台进行了一些繁重的处理,那么您的活动可能仍会遇到一些滞后现象。尝试降低您在服务中使用的线程的优先级。我在我的一个项目中遇到了类似的问题,我尝试将后台线程的优先级设置为PRIORITY_BACKGROUND(或者它是一个类似于此的常量),这解决了它。

编辑:在这里你可以阅读线程优先级:http://developer.android.com/reference/android/os/Process.html

答案 1 :(得分:0)

我忘了添加一个Thread并将处理程序附加到它。所以缺少的代码是:

private HandlerThread hThread;

@Override
public void onCreate() {
  super.onCreate();
  hThread = new HandlerThread("Processing thread");
  hThread.start();
  serviceHandler = new Handler(hThread.getLooper());
}

@Override
public void onDestroy() {
  super.onDestroy();
  hThread.getLooper().quit();
}