android如何后台运行定时方法

发布于 2022-08-24 02:35:42 字数 434 浏览 15 评论 0

应用有个需求,是定时去服务器获取一个账号是否有新的动态。
就像新浪微博那种,打开客户端,会自动提示有多少个 @ 。
我现在想到的方案是这样:

Timer timer = new Timer(); timer.scheduleAtFixedRate(
    new TimerTask() {
        public void run() {
            try {
                checkEvent();
                Thread.sleep(1000);
            } catch (Exception ie) {
            }
        }
    }, 1000, 1000 * 30);

不知道还有没有别的更合理的方案
我这样做会不会有什么风险?
求有经验的大侠分享。。。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

薯片软お妹 2022-08-31 02:35:42
public class RepeatTaskScheduler extends BroadcastReceiver {

    public static final String ACTION = "com.yourcompanyname.appname.action.RepeatTaskSchedule";

@Override
    public void onReceive(Context context, Intent intent) {
        if (ACTION.equals(action)) {
            checkEvent();
        }
    }
}
//在你想要的地方启动
public class YourActivity extends Activity{
    @Override
    public void onCreate() {
        super.onCreate();
        //如果interval的值太大会失效,几个小时没问题
        setRepeatTasks(1000, 1000 * 30);
    }
    private void setRepeatTasks(long triggerTime, long interval) {
            AlarmManager am = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(RepeatTaskScheduler.ACTION);
        //系统中如果有这个pendingIntent 取消
        PendingIntent pending = PendingIntent.getBroadcast(this, 0, intent,
                PendingIntent.FLAG_NO_CREATE);
        if (pending != null) {
            am.cancel(pending);
        }
        pending = PendingIntent.getBroadcast(this, 0, intent, 0);
        am.setRepeating(AlarmManager.RTC_WAKEUP, triggerTime, interval, pending);
    }
}

在AndroidManifest.xml中加入

<receiver android:name=".RepeatTaskScheduler">
    <intent-filter>
        <action android:name="com.yourcompanyname.appname.action.RepeatTaskSchedule" />
    </intent-filter>
</receiver>

代码我没测试过,只介绍思路,有问题留言

风轻花落早 2022-08-31 02:35:42

考虑用Handler吧

Handler handler;

 @Override
 public void onCreate(Bundle savedInstanceState) {
     // ...
     handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            updateUI();
        }
    };

    Thread thread = new Thread() {
        @Override
        public void run() {
            while(true) {
                Message msg = new Message();
                handler.sendMessage(msg);
                try {
                    sleep(3*1000); // 3 seconds
                } catch (InterruptedException e) {
                }
            }                       
        }
    };
    thread.start();
 }

 private synchronized void updateUI() {
     // ...
 }
七婞 2022-08-31 02:35:42

应该优先使用AlarmManager,Handler比较耗电,而且容易导致内存泄露。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文