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

时间:2016-01-12 11:33:56

标签: java android multithreading

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

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.

我该如何解决?

非常感谢您的任何建议。

3 个答案:

答案 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进行长时间运行。