【问题标题】:What type of threading for this kind of activity?这种活动的线程类型是什么?
【发布时间】:2017-12-26 18:34:04
【问题描述】:

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

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

详情:

我的滚动活动接收要显示的消息,作为可用于从服务范围访问的字符串数组。例如,服务启动 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(例如要显示一批新消息)时,旧的循环器/工作线程就会重新启动,同时还会有一个用于新消息的新线程。

我尝试将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);

【问题讨论】:

    标签: android android-activity android-asynctask android-thread


    【解决方案1】:

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

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

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

    由于这一切都存在于 Activity 本身中,因此在 Activity 终止时不需要进行任何清理。

    【讨论】:

    • 好吧,我的活动必须产生某种线程才能真正运行动画。让 Activity 处理自己的任务(比如显示一条或多条消息)对我来说更有意义(感觉更“干净”)。必须有一种方法可以正确地做到这一点......要么,要么你完全正确,我不会有一个包含整齐和干净的逻辑线索。
    • Android 的动画框架不应该要求您生成任何线程。你的动画效果如何?
    • 我想我误解了你。我以为你在 new Thread() 之类的调用中做动画。
    • 我的活动的主要工作是滚动文本。每当它需要滚动多条文本消息时,它需要遍历消息列表并一次滚动一条消息。 - - 它刚刚击中我......我可能会尝试在动画结束事件触发时为下一条消息设置动画?
    • 这正是我想说的
    猜你喜欢
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 2016-10-18
    • 2012-03-18
    • 2019-12-23
    • 2014-11-06
    • 1970-01-01
    • 2013-02-12
    相关资源
    最近更新 更多