Java Android:如何在不同的线程上运行服务中的方法?

Java Android:如何在不同的线程上运行服务中的方法?,java,android,multithreading,Java,Android,Multithreading,我试图在服务中做一些长时间的操作,这是从控制器开始的 public void startDashboardBgService() { Boolean isAppInForeground = Container.getInstance().isAppInForeground(); if (isAppInForeground) { stopDashboardBgService(); context.startServic

我试图在服务中做一些长时间的操作,这是从控制器开始的

public void startDashboardBgService() {
        Boolean isAppInForeground = Container.getInstance().isAppInForeground();
        if (isAppInForeground) {
            stopDashboardBgService();
            context.startService(new Intent(context, DashboardService.class));
        }
    }
然后,我从onStartCommand事件调用长时间操作方法

@Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Logger.d("onStartCommand");
        updateDashboardValues();
        handler =  new Handler();
        context = this;
        return mStartMode;
    }
这是在分离线程上工作的方法

private Runnable runnableCode = new Runnable() {
    @Override
    public void run() {
        List<Reminder> reminders = Reminder.getAllRemindersFromDB(context);
        if (reminders.size() > 0) {
            for (Reminder r : reminders) {
                Logger.d(r.getMessage());
            }
        } else {
            Logger.d("No reminders in table, dashboard cannot be updated");
        }
    }
};

private void updateDashboardValues() {
    try {
        Thread t = new Thread(runnableCode);
        t.start();
    } catch (Exception e) {
        TrackingEventLogHelper.logException(e, Constants.Global.EXCEPTION,
                Constants.ExceptionMessage.EXC_CANNOT_CANCEL_UNIQUE_ALARM_FOR_DASHBOARD_CHECK, true);
    }
}
我怎样才能解决它呢


非常感谢您的建议。

尝试在
异步任务中运行代码,请参见下面的示例。注意:您可以使用所需的任何类型对其进行参数化

Edit:如何将参数(本例中为
Context
)传递给任务的示例

 new AsyncTask<Context, Void, Void>() {

        //local fields

        @Override
        protected void onPreExecute() {
            //runs on UI Thread
        }

        @Override
        protected void onCancelled() {
           /* runs on UI Thread instead of onPostExecute()
               if cancel(boolean) was called */
        }

        @Override
        protected void onProgressUpdate(Progress... values) {
            //runs on UI Thread
        }

        @Override
        protected Void doInBackground(Context... params) {
          //background Thread - do heavy work here
            Context c = params[0];
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
          //runs on UI Thread
        }

    }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, mContext);
newasynctask(){
//局部字段
@凌驾
受保护的void onPreExecute(){
//在UI线程上运行
}
@凌驾
受保护的void onCancelled(){
/*在UI线程上运行,而不是在onPostExecute()上运行
如果调用了cancel(布尔值)*/
}
@凌驾
受保护的void onProgressUpdate(进度…值){
//在UI线程上运行
}
@凌驾
受保护的Void doInBackground(上下文…参数){
//背景线程-在这里做繁重的工作
上下文c=参数[0];
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
//在UI线程上运行
}
}.executeOnExecutor(AsyncTask.THREAD\u POOL\u EXECUTOR,mContext);

尝试在
异步任务中运行代码,请参见下面的示例。注意:您可以使用所需的任何类型对其进行参数化

Edit:如何将参数(本例中为
Context
)传递给任务的示例

 new AsyncTask<Context, Void, Void>() {

        //local fields

        @Override
        protected void onPreExecute() {
            //runs on UI Thread
        }

        @Override
        protected void onCancelled() {
           /* runs on UI Thread instead of onPostExecute()
               if cancel(boolean) was called */
        }

        @Override
        protected void onProgressUpdate(Progress... values) {
            //runs on UI Thread
        }

        @Override
        protected Void doInBackground(Context... params) {
          //background Thread - do heavy work here
            Context c = params[0];
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
          //runs on UI Thread
        }

    }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, mContext);
newasynctask(){
//局部字段
@凌驾
受保护的void onPreExecute(){
//在UI线程上运行
}
@凌驾
受保护的void onCancelled(){
/*在UI线程上运行,而不是在onPostExecute()上运行
如果调用了cancel(布尔值)*/
}
@凌驾
受保护的void onProgressUpdate(进度…值){
//在UI线程上运行
}
@凌驾
受保护的Void doInBackground(上下文…参数){
//背景线程-在这里做繁重的工作
上下文c=参数[0];
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
//在UI线程上运行
}
}.executeOnExecutor(AsyncTask.THREAD\u POOL\u EXECUTOR,mContext);

您可以创建一个新的线程&Runnable并将您的方法封装在其中


或者,您可以使用自动在工作线程中运行方法的

您可以创建一个新的线程&一个可运行的并将您的方法包装在其中


或者,您可以使用一个在工作线程中自动运行方法的,默认情况下在UI线程上运行的Android服务。如果您必须做一些繁重的工作,您需要在辅助线程上执行它


最好用于长时间运行的操作,因为不建议将AsyncTask用于长时间运行的操作

默认情况下,Android服务在UI线程上运行。如果您必须做一些繁重的工作,您需要在辅助线程上执行它


最好用于长时间运行的操作,因为不建议将AsyncTask用于长时间运行的操作

您是否尝试过在
异步任务中运行代码?这是(在大多数情况下)比您自己使用
线程更可取的解决方案是的,但我无法让它在服务中工作。您能在服务中添加一些方法的示例用法吗?在主线程上运行的常规服务。如果您想在服务中进行后台工作,可以使用IntentService实现。但在服务中使用AsyncTask也是一个很好的解决方案,或者不是?@redrom我发布了一个基本的使用示例。您是否尝试在
AsyncTask
中运行代码?这是(在大多数情况下)比您自己使用
线程更可取的解决方案是的,但我无法让它在服务中工作。您能在服务中添加一些方法的示例用法吗?在主线程上运行的常规服务。如果你想在服务中做后台工作,你可以使用IntentService实现。但是在服务中使用AsyncTask也是一个很好的解决方案,或者不是?@redrom I发布了一个基本的使用示例