繁体   English   中英

Android中的无限循环线程

[英]Infinitely Looping A Thread In Android

我正在尝试无限循环一个线程,但它只运行一次。 我能找到的唯一解决方案是针对Java的旧版本,该版本似乎不再起作用。

这是启动循环的活动:

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)

在执行while(runGrowLoop == true)类的操作while(runGrowLoop == true) ,这会占用大量CPU资源。 您应该使用synchronized块。

在这里看看,它已经有了答案:

Android无限循环线程

尝试使用AsyncTask 并通过OnProgressUpdate方法更新视图。 您可以在doInBackground方法中进行操作,例如

protected Long doInBackground(URL... urls) {
       while(runGrowLoop){
          // Something to do.
          publishProgress(1L)
       }
 }

您肯定在以下位置有例外:

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

更新视图。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM