0

我有一个由后台服务启动的活动,以显示该服务从服务器接收到的滚动消息。可以只有一个滚动消息或一组多个滚动消息,一次滚动一个。

我的问题是管理循环滚动多条消息和多组多条消息的理想方法是什么?我已经在工作线程、AsyncTask 等中尝试了我的循环器循环。

细节:

我的滚动活动接收要显示的消息,作为可用于从服务范围访问的字符串数组。例如,服务启动 Activity 以便一个接一个地滚动多条消息:

  1. 我的服务填充MyService.messages[]了要显示的消息,然后启动MyScrollActivity
  2. MyScrollActivity大小为MyService.messages[]. 如果 >1,则启动MyCyclerThread (或 AsyncTask 等 - 还没有找到最好的方法!)
  3. MyCyclerThread循环MyService.messages[]并设置MyScrollActivityTextViewmessages[i]并在屏幕上设置一次动画,一次一个消息迭代(一条消息滚动,然后下一条,等等 - 在循环结束时,它重新开始i=0并再次重复消息。
  4. 重复步骤 3 直到活动被服务取消或显示另一个活动。循环器线程(或其他任何循环)此时需要终止。

我希望那个特定的工作线程(正在进行循环)死掉,并且在它的活动停止时永远不会回来。但是由于某种原因,每当重新启动活动时(例如进入显示一批新消息),旧的循环器/工作线程就会复活,以及新消息的新线程。

我尝试添加Thread.currentThread().interrupt()到活动onPauseonDestroy方法中,我在日志中看到线程确实被中断了。但就像我说的那样,它会复活(即使使用以前的相同 ID)并再次开始循环。这意味着无论我开始活动多少“X”次,我也会获得“X-1”个线程运行。

我玩弄了 Activity 单实例 XML、各种“isThreadABCrunning”标志等。我什至尝试在我的循环器循环中使用 AsyncTask。我的想法不多了。

帮助,我是Android的初学者/中级......显然,我知道足以制造麻烦。关于线程或活动,我有什么遗漏吗?是否可能像以不同方式处理我的活动一样简单?

我很感激 30,000 英尺的概述,然后我可以根据需要提供代码示例(我已经经历了太多的迭代,暂时无法确定一个在这里发布),如果我快要违反了,很抱歉帖子的最佳实践。

更新:动画代码

    slide = new TranslateAnimation(dm.widthPixels, -params.width, 0, 0);
    slide.setDuration(animDuration);
    slide.setRepeatCount(repititions);
    slide.setRepeatMode(Animation.RESTART);
    slide.setInterpolator(new LinearInterpolator());
    slide.setAnimationListener(new Animation.AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {
            msgIsScrolling = true;
        }
        @Override
        public void onAnimationEnd(Animation animation) {
            msgIsScrolling = false;
        }
        @Override
        public void onAnimationRepeat(Animation animation) {
            //nothing to do
        }
    });
    textView_message.startAnimation(slide);
4

1 回答 1

1

我的直觉反应是“多线程”解决方案是解决这个问题的错误方法。我的第一个想法是:

  • 更改您的设计,使活动只要求服务显示“下一条”消息(活动不应该知道有多少消息或它所在的消息索引,它应该只显示服务提供的任何消息)。
  • 使用Animator.AnimatorListener'sonAnimationEnd()方法重新触发您的动画。

本质上,您在 Activity 中有一些方法可以接收消息并启动它的动画。当您的活动首次显示时以及消息滚动完成时,您都会调用此方法。

由于这一切都存在于活动本身内,因此活动结束时不需要进行任何清理。

于 2017-07-20T21:19:21.997 回答