我试图无限循环一个线程,但它只运行一次。我能找到的唯一解决方案是旧版Java,它似乎不再适用了。
这是启动循环的Activity:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Thread growCoin = new Thread(new GrowingCoin());
growCoin.start();
}
}
处理循环的类:
public class GrowingCoin implements Runnable{
CoinTracker co = new CoinTracker();
boolean runGrowLoop = true;
public void run(){
try{
while(runGrowLoop == true){
co.copper = (int) (co.copper + (co.copper * 0.2));
MainActivity.coppertv.setText("Copper: " + co.copper);
Thread.sleep(1000);
Log.i("thread debug", "thread sleeping");
}
}
catch(Exception e){
}
}
}
我认为它与CoinTracker类没有更新有关,因为我以前遇到过类似的问题,但如果是这样的话,我不知道如何解决这个问题。
提前感谢任何解决方案/尝试解决问题。
编辑:
我对LogCat的经验很少,但我认为标签System.err意味着重要的东西,所以我在这个标签上得到了一切。我无法弄清楚错误信息的含义:
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6247)
at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:902)
at android.view.ViewGroup.invalidateChild(ViewGroup.java:4637)
at android.view.View.invalidateInternal(View.java:11690)
at android.view.View.invalidate(View.java:11654)
at android.view.View.invalidate(View.java:11638)
at android.widget.TextView.checkForRelayout(TextView.java:6842)
at android.widget.TextView.setText(TextView.java:4047)
at android.widget.TextView.setText(TextView.java:3905)
at android.widget.TextView.setText(TextView.java:3880)
at me.test.first.GrowingCoin.run(GrowingCoin.java:13)
at java.lang.Thread.run(Thread.java:818)
答案 0 :(得分:1)
在执行while(runGrowLoop == true)
之类的操作时要小心,这需要大量的CPU资源。您应该使用synchronized
块。
看看这里,它已经有了答案:
答案 1 :(得分:1)
使用AsyncTask进行尝试。并通过OnProgressUpdate Methode更新您的View。 你可以在doInBackground方法中完成你的工作,例如
protected Long doInBackground(URL... urls) {
while(runGrowLoop){
// Something to do.
publishProgress(1L)
}
}
答案 2 :(得分:1)
你肯定有例外:
MainActivity.coppertv.setText(“Copper:”+ co.copper);
有一些标题:
android.view.ViewRootImpl $ CalledFromWrongThreadException:只有 创建视图层次结构的原始线程可以触及其视图。
所以你必须这样做:
MainActivity.coppertv.post(new Runnable() {
@Override
public void run() {
MainActivity.coppertv.setText("Copper: " + co.copper);}
});
或使用
runOnUiThread(new Runnable() {
@Override
public void run() {
MainActivity.coppertv.setText("Copper: " + co.copper);}
});
更新视图。