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