首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内装TimerTask

内装TimerTask
EN

Stack Overflow用户
提问于 2016-04-04 14:05:11
回答 3查看 1.1K关注 0票数 0

基本上,我需要在片段中使用TimerTask,但是出现了以下错误:

代码语言:javascript
复制
04-04 15:01:02.710 28397-28528/com.example.sdilab.pap E/AndroidRuntime: FATAL EXCEPTION: Timer-1
    android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
    at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:5471)
    at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:1007)
    at android.view.View.requestLayout(View.java:15850)
    at android.view.View.requestLayout(View.java:15850)
    at android.view.View.requestLayout(View.java:15850)
    at android.view.View.requestLayout(View.java:15850)
    at android.view.View.requestLayout(View.java:15850)
    at android.view.View.requestLayout(View.java:15850)
    at android.support.v4.widget.DrawerLayout.requestLayout(DrawerLayout.java:1255)
    at android.view.View.requestLayout(View.java:15850)
    at android.view.View.requestLayout(View.java:15850)
    at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:334)
    at android.view.View.requestLayout(View.java:15850)
    at android.view.View.requestLayout(View.java:15850)
    at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:334)
    at android.view.View.requestLayout(View.java:15850)
    at android.view.View.requestLayout(View.java:15850)
    at android.widget.TextView.checkForRelayout(TextView.java:6615)
    at android.widget.TextView.setText(TextView.java:3753)
    at android.widget.TextView.setText(TextView.java:3608)
    at android.widget.TextView.setText(TextView.java:3583)
    at com.example.sdilab.pap.StepsFragment$1.run(StepsFragment.java:87)
    at java.util.Timer$TimerImpl.run(Timer.java:284)

这是我需要使用的代码:

代码语言:javascript
复制
timer.schedule( new TimerTask() {
            public void run() {
                double value = Double.parseDouble(readFromFile());
                String roundedvalue = Math.round(passos) + "";
                textView.setText(roundedvalue);

            }
        }, 0, 1*1000);

我的问题是:如何使用这段代码/实现相同的结果,以便在我的片段中使用这段代码?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-04-04 14:07:58

使用runOnUiThread()方法更新TextView

代码语言:javascript
复制
timer.schedule( new TimerTask() {
                public void run() {
                    double value = Double.parseDouble(readFromFile());
                    String roundedvalue = Math.round(passos) + "";

         runOnUiThread(new Runnable() {
                public void run() {
                   textView.setText(roundedvalue);  
                 }
             });



                }
            }, 0, 1*1000);
票数 1
EN

Stack Overflow用户

发布于 2016-04-04 14:11:23

您的问题是,您正在尝试更新主线程之外的视图。处理此问题的一个简单方法是使用处理程序来确保您正在以正确的方式更新视图。下面是一个例子:

代码语言:javascript
复制
private Handler updateHandler = new Handler();

timer.schedule( new TimerTask() {
        public void run() {
            double value = Double.parseDouble(readFromFile());
            String roundedvalue = Math.round(passos) + "";
            updateHandler.postRunnable(new Runnable() {
                public void run() {
                    textView.setText(roundedvalue); 
                }
            });
        }
    }, 0, 1*1000);

还有一个runOnUiThread()方法,如果您在一个活动中,它也会这样做。

票数 0
EN

Stack Overflow用户

发布于 2020-05-18 01:44:43

您也可以使用此代码。这应该在onCreateView方法中完成。Fir示例,我希望一个ViewPager自动移动到下一个幻灯片,等待6秒,然后滑到下一个内容。

代码语言:javascript
复制
//Create a new Timer and Handler object
Timer timer = new Timer;
Handler updateSlide = new Handler();
private static int delay = 300; //delay before moving to the next slide.
private static int wait = 6000;
timer.schedule(new TimerTask (){
   @Override
   public void run (){
      //gets the list, and puts the last into the front
      updateSlide.postAtFrontOfQueue(new Runnable(){ 

       @Override
       public void run (){

         if(viewPager.getCurrentItem() < sliderList.size() -1){

            viewPager.setCurrentItem(viewPager.getCurrentItem() +1);

         }
         else{

              viewPager.setCurrentItem(0);

         }

       }

      });
   }
}, delay, wait);

有了这个我希望你能理解。这段代码提供了使用Handler()在片段中使用TimerTask的特权。在一个活动中,使用MainActivity.runOnUiThread(nee Runnable()....非常好。

因此,我建议您在片段中使用上面的代码示例。谢谢。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36404911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档