【问题标题】:Android Async Task Not RepeatingAndroid异步任务不重复
【发布时间】:2012-11-06 17:54:23
【问题描述】:

我有一个启动服务的活动(称为 StartActivity)。服务调用我的 MainActivity 类中的方法。该过程应该在 Service 类内部的计时器上重复。该程序在一次执行后停止,但显然没有重新安排。我知道在启动 Activity 时将 onStart 命令提供给服务,因为程序第一次运行时,当单击 Activity 时。两个任务都不会再次运行。任何的建议都受欢迎。 TLDR:计时器没有重复调用方法。它只在第一次工作。

服务类

import java.util.TimerTask;
import java.util.Calendar;
import java.util.Timer;
import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;

public class SvcActivity extends Service {

    TimerTask questionTask;
    TimerTask gpsTask;
    Handler handler = new Handler();
    Timer t = new Timer();

    @Override
    public int onStartCommand(Intent i,int flags,int startID) {
        Log.i("AAA","---In service---");
        questionTask = new TimerTask() {
            public void run() {
                handler.post(new Runnable() {
                    public void run() {
                        if(getHour()>=10&&getHour()<=22)
                        {
                            Intent i=new Intent(SvcActivity.this,MainActivity.class);
                            i.putExtra("key", "setup");
                            i.setFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
                            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                            Log.i("AAA","---right before startActivity---");
                            startActivity(i);
                        }
                        else
                            Log.i("AAA","---not between 10am and 10pm. Correct!");
                    }
                });
            }
        };

        gpsTask = new TimerTask() {
            public void run() {
                handler.post(new Runnable() {
                    public void run() {
                        Log.i("AAA","---in async task");
                        if(MainActivity.con!=null)
                        {
                        Log.i("AAA","---about to call async task");
                        BackgroundActivity objAsyncTask = new BackgroundActivity();            
                        objAsyncTask.execute();
                        }
                    }
                });
            }
        };

        int q=(int)(Math.random() * 2);
        if(q<1)
        {
        // first run, subsequent time delay. in miliseconds
            t.schedule(questionTask, 300, (3600000+2700000)); // 1 hour 45 min  
        }
        else
            t.schedule(questionTask, 300, (7200000+900000)); // 2 hour 15 min   

        t.schedule(gpsTask, 300, 300000);// 5 min

        return START_STICKY;
    }

    //-----------------------------get hour------------------------------------------
    public int getHour()
    {
        Calendar c=Calendar.getInstance();
        int hour=c.get(Calendar.HOUR_OF_DAY);
        return hour;
    }

    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;
    }


}

【问题讨论】:

  • 这不是一个答案,但我已经回答了类似的问题,使用Handler 总是更好:stackoverflow.com/questions/13100196/…
  • if(MainActivity.con!=null) - 不要这样做。如果我没看错,那么 MainActivity 扩展了 Android Activity 类。如果是这种情况,切勿在 Activity 中公开任何方法或字段并尝试从任何其他应用程序组件访问它们。 Activity 应该是完全独立的。
  • 谢谢你们的回复,但我仍然不明白为什么几分钟后电话就停止了。@Chris.jenkins 我以为我已经在使用处理程序了。我看了你的另一个帖子,我错过了什么吗?我希望让通话保持一段时间,我可以使用一个倒数计时器设置很长时间吗?这不是一个好的解决方案,但它是我能想到的唯一尝试。

标签: android service android-asynctask


【解决方案1】:

问题是活动被杀死了。即使它正在重新启动,这也扰乱了时间。我最终的解决方案是使用 AlarmManager 设置一个不受被杀死活动影响的重复警报。然后我用 BroadcastReceiver 捕捉到这个并从那里执行我的代码。

【讨论】:

    猜你喜欢
    • 2017-03-14
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    • 1970-01-01
    • 2021-07-05
    • 2021-05-07
    相关资源
    最近更新 更多