这种 activity 的线程类型是什么?

What type of threading for this kind of activity?

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

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

详情:

我的卷轴 activity 收到要显示的消息,作为可供它从服务范围访问的字符串数组。比方说,服务启动 activity 以便滚动几条消息,一条接一条:

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

我希望那个特定的工作线程(正在执行循环)死掉并且在它 activity 停止时永远不会回来。但出于某种原因,每当 activity 重新启动时(比如要显示一批新消息),旧的 cycler/worker 线程会复活,同时会为新消息创建一个新线程。

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

我玩过 Activity 单实例 XML、各种 "isThreadABCrunning" 标志等。我什至尝试过为我的循环器循环使用 AsyncTask。我 运行 没主意了。

救命啊,我是beginner/intermediate Android...显然,我只知道惹麻烦。关于线程或活动,我缺少什么吗?是否可能像以不同方式处理我的 activity 一样简单?

我希望获得 30,000 英尺的概述,然后我可以根据需要提供代码示例(我已经经历了太多次迭代,暂时无法在 post 中确定一个),很抱歉如果我快要违反 post 的最佳实践了。

更新:动画代码

    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);

我的直觉反应是 "multithreaded" 解决方案是解决此问题的错误方法。我的第一个想法是:

  • 更改您的设计,以便 activity 只要求服务显示 "next" 消息(activity 不应该知道有多少条消息或它的消息索引是什么打开,它应该只显示服务提供的任何消息)。
  • 使用 Animator.AnimatorListeneronAnimationEnd() 方法重新触发动画。

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

因为这一切都存在于 activity 内部,所以当 activity 死亡时不需要任何清理。