此类活动的线程类型是什么类型?

时间:2017-07-20 21:11:59

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

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

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

详细信息:

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

  1. 我的服务使用要显示的消息填充MyService.messages[],然后启动MyScrollActivity
  2. MyScrollActivity的大小为MyService.messages[]。如果> 1,请启动MyCyclerThread (或AsyncTask等等 - 无法找到最佳方式!)
  3. MyCyclerThread遍历MyService.messages[]并将MyScrollActivity TextView设置为messages[i]并在屏幕上设置动画一次,一次一次消息迭代(一条消息滚动,然后是接下来,等等 - 在循环结束时,它从i=0重新开始并再次重复这些消息。
  4. 重复步骤3,直到服务取消活动或显示其他活动。循环器线程(或任何 - 循环)此时需要死亡。
  5. 我希望那个特定的工作线程(它正在进行循环)死掉,并且在它的活动停止时永远不会回来。但由于某种原因,每当重新启动活动时(比如显示新的一批消息),旧的循环器/工作线程将重新启动,并为新消息重新启动。

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

    我玩弄了活动单实例XML,各种" isThreadABCrunning"我甚至尝试过使用AsyncTask作为循环器循环。我的想法已经不多了。

    帮助,我是Android的初学者/中级人员......显然,我知道这足以惹麻烦了。是否有关于线程或活动的遗漏?它可能就像处理我的活动一样简单吗?

    我很欣赏一个30,000英尺的概述,然后我可以根据需要提供代码示例(我已经经历了太多的迭代以确定现在发布的一个),很抱歉,如果我和#39; m踩着接近违反帖子的最佳做法。

    更新:动画代码

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

1 个答案:

答案 0 :(得分:1)

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

  • 更改您的设计,以便活动只是要求服务显示“下一个”消息(活动不应该知道它有多少消息或消息索引,它应该只显示服务给它的任何消息)。
  • 使用Animator.AnimatorListener的{​​{1}}方法重新触发动画。

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

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