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发布了一个基本的使用示例