如何停止Executors.newSingleThreadScheduledExecutor();在线程执行之间?

时间:2013-07-26 05:49:48

标签: android animation curl textview page-curl

下面我发布我正在运行的主题的代码,以便在Page Curl activity by harism之上的RelativeLayout中为文本设置动画。

public void startProgress(final int index)
{
    runnable = new Runnable()
    {
        @Override
        public void run()
        {
            mArrWords.removeAll(mArrWords);
            mStart.removeAll(mStart);
            mEnd.removeAll(mEnd);

            words = sentence.split(" ");
            for(int i = 0; i < words.length; i++)
            {
                mArrWords.add(words[i]);
                if(i == 0)
                {
                    mStart.add(0);
                    mEnd.add(words[0].length());
                }
                else
                {
                    mStart.add(mEnd.get(i-1)+1);
                    mEnd.add(mStart.get(i)+words[i].length());
                }
                /*Log.e("words", "" + "" + words[i]);
                Log.e("mArrWords", "" + mArrWords);
                Log.e("mStart", "" + mStart);
                Log.e("mEnd", "" + mEnd);*/
            }
            for (int i = 0; i < mArrWords.size(); i++)
            {
                final int value = i;
                try
                {
                    Thread.sleep(500);
                }
                catch (InterruptedException e)
                {
                    e.printStackTrace();
                }

                mHandler.post(new Runnable()
                {
                    @Override
                    public void run()
                    {
                        currIndex = index;
                        try
                        {

                            if(CurlView.ANIMATE)
                                tv1.setVisibility(View.VISIBLE);
                            else
                                tv1.setVisibility(View.GONE);

                            final Pattern p = Pattern.compile(mArrWords.get(value));
                            final Matcher matcher = p.matcher(sentence);
                            SpannableString spannableTxt = new SpannableString(sentence);
                            ForegroundColorSpan span = new ForegroundColorSpan(Color.RED);
                            while(matcher.find())
                                spannableTxt.setSpan(span, mStart.get(value), mEnd.get(value), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                            tv1.setText(spannableTxt);
                            mHandler.sendEmptyMessage(0);
                        }
                        catch (Exception e) 
                        {
                            e.printStackTrace();
                            mHandler.sendEmptyMessage(0);
                        }
                    }
                });
            }
        }
    };
    final ScheduledExecutorService worker = Executors.newSingleThreadScheduledExecutor();
    worker.schedule(runnable, CurlView.ANIMTIME+50, TimeUnit.MILLISECONDS);
}

在这里,我正在为图像设置文本动画。我需要更改我要更改的每个页面的文本。我可以更改文本,但是,当我翻页时,我存储在ArrayLists中的索引值没有被清除。我将一个句子存储在名为mArrWords的ArrayList中,并且用于引用句子中每个单词的索引存储在mStart和mEnd中。

我面临的问题是当文本改变时,动画开始于存储在mStart中的先前索引和用于存储特定单词的索引的mEnd ArrayLists。我需要知道的是,当页面翻页或页面索引发生变化时,如何停止我的线程。我在Curl活动的updatePage(最终的CurlPage页面,final int width,final int height,final int index)方法中调用此函数。我希望我能够解释我的问题。谢谢!

编辑:我想更明确地指出我的问题。如何在启动另一个线程之前检查线程是否已经运行并停止执行上一个线程?

1 个答案:

答案 0 :(得分:0)

removeCallbacks(..)仅停止待处理的消息(Runnables)。如果runnable已启动,则无法以这种方式停止它。请参阅以下内容:

removecallbacks-not-stopping-runnable