Android 为什么当我运行service和handler.post方法中的东西时,我的活动仍然滞后?

Android 为什么当我运行service和handler.post方法中的东西时,我的活动仍然滞后?,android,service,handler,Android,Service,Handler,我很困惑为什么我的活动仍然滞后,我使用的远程服务方法很少,而且每个都有自己的工作,比如下载资料、处理数据、比较资料等等。。。它将在后台运行,以选定的时间间隔更新数据,并通过notify系统通知用户更改 之所以使用远程服务,是因为我最终会添加一个小部件,而且即使android停止活动,服务也需要保持运行,所以我在每次onPause()上都将其解除绑定。 但据我所知,这并不是我的问题所在 但回到我的问题上来。。。所以,当我运行service和handler.post方法中的东西时,我的活动仍然滞后

我很困惑为什么我的活动仍然滞后,我使用的远程服务方法很少,而且每个都有自己的工作,比如下载资料、处理数据、比较资料等等。。。它将在后台运行,以选定的时间间隔更新数据,并通过notify系统通知用户更改

之所以使用远程服务,是因为我最终会添加一个小部件,而且即使android停止活动,服务也需要保持运行,所以我在每次onPause()上都将其解除绑定。 但据我所知,这并不是我的问题所在

但回到我的问题上来。。。所以,当我运行service和handler.post方法中的东西时,我的活动仍然滞后

代码如下:

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

  }
}
我还想添加progressDialog,以便通过Activity作为此服务的侦听器在updateLayer(…)中进行更新,但效果不太好。更新progressDialog的最佳方式是什么?有没有听过,处理过,意图,或者什么


那么我该如何正确地做到这一点呢?

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


编辑:在这里您可以阅读有关线程优先级的信息:

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


编辑:这里您可以阅读有关线程优先级的信息:

我忘记添加线程并将处理程序附加到它。因此,缺少的代码是:

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

我忘记添加线程并将处理程序附加到它。因此,缺少的代码是:

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

我添加了Process.setThreadPriority(Process.THREAD\u PRIORITY\u后台);进入run()后,没有任何更改。我很确定我的方法仍然在GUI线程中运行,我只是不确定为什么。我添加了Process.setThreadPriority(Process.thread\u PRIORITY\u BACKGROUND);进入run()后,没有任何更改。我很确定我的方法仍然在GUI线程中运行,只是不知道为什么。