我试图在服务器上做一些长时间的操作,这是从控制器开始的。
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);
}
}
但是,从活动(控制器)UI调用的方法何时落后并且我收到了消息。
Skipped 604 frames! The application may be doing too much work on its main thread.
我该如何解决?
非常感谢您的任何建议。
答案 0 :(得分:2)
尝试在AsyncTask
中运行代码,请参阅下面的示例。注意:您可以使用您需要的任何类型对其进行参数化。
编辑:如何将参数(在本例中为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);
答案 1 :(得分:1)
您可以创建一个新的主题&amp;一个Runnable 并将你的方法包装在其中。
或者您可以使用IntentService来自动处理工作线程中的方法
答案 2 :(得分:1)
默认情况下,Android服务在UI线程上运行。如果你需要做一些繁重的工作,你需要在工作线程上执行它。
最好将IntentService用于长时间运行的操作,因为不建议使用AsyncTask进行长时间运行。