有关服务类和多线程的一般信息

时间:2015-04-26 10:06:12

标签: android multithreading sqlite

我正在运行代码,用户选择日期和时间。用户可以在将来选择任何日期和时间。这些日期和时间存储在sqlite数据库中。用户选择这些日期和时间后,活动将调用服务类,我将按以下方式运行新线程

public int onStartCommand(Intent intent, int flags, int startId) {
    final AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    final SqliteController db = new SqliteController(getApplicationContext());

    new Thread(new Runnable() {
        @Override
        public void run() {

            List<Greetings> greetings = db.getAllGreetings();
            if (db.getGreetingsCount() >= 0) {
                do {
                    for (Greetings g : greetings) {
                        Calendar cal = Calendar.getInstance();
                      .........
                      .........//other codes

此线程访问数据库中的数据,并将时间和日期与系统时间和日期相匹配。一个日期和时间匹配,我正在使用这样的广播接收器的报警管理器

if (dnt.equals(cdt)) {
             Intent aint = new Intent(getApplicationContext(), AlarmReceiver.class);

              aint.putExtra("msg", msg);
              aint.putExtra("phone", phone);
              aint.putExtra("id", id);
  PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), id, aint, PendingIntent.FLAG_UPDATE_CURRENT);
        alarmManager.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pendingIntent);
          db.deleteGreetings(g);
                        }

我想知道,这是正确的方法吗?当我在模拟器中运行程序时,有时它运行正常,但有时它显示“应用程序在主线程中执行了太多工作”。那么,我做错了什么?或者有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

由于几乎所有发布的代码都在后台线程中运行,这不会导致应用程序在主线程中执行太多工作。您的问题可能来自其他来源。

您可以尝试使用跟踪视图分析您的应用,如Android文档here中所述。尝试找出哪些方法消耗最多的时间来缩小搜索范围。

另外,如果您的服务只是在后台创建运行此任务的单个线程,则应使用IntentService而不是服务。然后,您实现onHandleIntent方法而不是onStartCommand方法。 IntentService将处理它在单个后台Looper中收到的所有操作。