基本上,我需要在片段中使用TimerTask,但是出现了以下错误:
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)这是我需要使用的代码:
timer.schedule( new TimerTask() {
public void run() {
double value = Double.parseDouble(readFromFile());
String roundedvalue = Math.round(passos) + "";
textView.setText(roundedvalue);
}
}, 0, 1*1000);我的问题是:如何使用这段代码/实现相同的结果,以便在我的片段中使用这段代码?
发布于 2016-04-04 14:07:58
使用runOnUiThread()方法更新TextView
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);发布于 2016-04-04 14:11:23
您的问题是,您正在尝试更新主线程之外的视图。处理此问题的一个简单方法是使用处理程序来确保您正在以正确的方式更新视图。下面是一个例子:
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()方法,如果您在一个活动中,它也会这样做。
发布于 2020-05-18 01:44:43
您也可以使用此代码。这应该在onCreateView方法中完成。Fir示例,我希望一个ViewPager自动移动到下一个幻灯片,等待6秒,然后滑到下一个内容。
//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()....非常好。
因此,我建议您在片段中使用上面的代码示例。谢谢。
https://stackoverflow.com/questions/36404911
复制相似问题