Java 在Android中无限循环线程

Java 在Android中无限循环线程,java,android,infinite-loop,Java,Android,Infinite Loop,我试图无限循环一个线程,但它只运行一次。我能找到的唯一解决方案是旧版本的Java,它似乎不再工作了 以下是启动循环的活动: public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Thread growCoin = ne

我试图无限循环一个线程,但它只运行一次。我能找到的唯一解决方案是旧版本的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){

        }
    }
}
处理循环的类:

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没有什么经验,但我认为tag System.err意味着一些重要的东西,下面是我从这个tag获得的所有信息。我无法理解错误消息的含义:

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)

在执行(runGrowLoop==true)之类的操作时要小心,这将占用大量CPU资源。您应该使用
synchronized

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


在执行类似
的操作时要小心(runGrowLoop==true)
,这将占用大量CPU资源。您应该使用
synchronized

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


在执行类似
的操作时要小心(runGrowLoop==true)
,这将占用大量CPU资源。您应该使用
synchronized

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


在执行类似
的操作时要小心(runGrowLoop==true)
,这将占用大量CPU资源。您应该使用
synchronized

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

试着用一只手。并通过OnProgressUpdate方法更新视图。 你可以用doInBackground方法来做你的事情

protected Long doInBackground(URL... urls) {
       while(runGrowLoop){
          // Something to do.
          publishProgress(1L)
       }
 }
用一支钢笔试试看。并通过OnProgressUpdate方法更新视图。 你可以用doInBackground方法来做你的事情

protected Long doInBackground(URL... urls) {
       while(runGrowLoop){
          // Something to do.
          publishProgress(1L)
       }
 }
用一支钢笔试试看。并通过OnProgressUpdate方法更新视图。 你可以用doInBackground方法来做你的事情

protected Long doInBackground(URL... urls) {
       while(runGrowLoop){
          // Something to do.
          publishProgress(1L)
       }
 }
用一支钢笔试试看。并通过OnProgressUpdate方法更新视图。 你可以用doInBackground方法来做你的事情

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

你肯定在以下方面有例外:

MainActivity.coppertv.setText(“铜:+co.Copper”)

标题为:

android.view.ViewRootImpl$CalledFromErrorThreadException:只有 创建视图层次结构的原始线程可以接触其视图

因此,您必须执行以下操作:

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

更新视图。

您肯定会在以下位置遇到异常:

MainActivity.coppertv.setText(“铜:+co.Copper”)

标题为:

android.view.ViewRootImpl$CalledFromErrorThreadException:只有 创建视图层次结构的原始线程可以接触其视图

因此,您必须执行以下操作:

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

更新视图。

您肯定会在以下位置遇到异常:

MainActivity.coppertv.setText(“铜:+co.Copper”)

标题为:

android.view.ViewRootImpl$CalledFromErrorThreadException:只有 创建视图层次结构的原始线程可以接触其视图

因此,您必须执行以下操作:

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

更新视图。

您肯定会在以下位置遇到异常:

MainActivity.coppertv.setText(“铜:+co.Copper”)

标题为:

android.view.ViewRootImpl$CalledFromErrorThreadException:只有 创建视图层次结构的原始线程可以接触其视图

因此,您必须执行以下操作:

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


更新视图。

尝试记录异常,以防while循环中发生任何奇怪的情况。最好避免无声的捕捉@抱歉,我没听到那句话。它的设置如下:catch(Exception e){e.printStackTrace();}您可能在MainActivity.coppertv.setText(“Copper:+co.Copper”)中得到一个异常;文本是否更新过一次?@JibranKhan如果setText出现某种错误,请选中编辑。是的,您正在从另一个线程更新主UI线程视图。使用主活动上下文更新
TextView
(coppertv)尝试记录异常,以防while循环中发生任何奇怪的情况。最好避免无声的捕捉@抱歉,我没听到那句话。它的设置如下:catch(Exception e){e.printStackTrace();}您可能在MainActivity.coppertv.setText(“Copper:+co.Copper”)中得到一个异常;文本是否更新过一次?@JibranKhan如果setText出现某种错误,请选中编辑。是的,您正在从另一个线程更新主UI线程视图。使用主活动上下文更新
TextView
(coppertv)尝试记录异常,以防while循环中发生任何奇怪的情况。最好避免无声的捕捉@抱歉,我没听到那句话。它的设置如下:catch(Exception e){e.printStackTrace();}您可能在MainActivity.coppertv.setText(“Copper:+co.Copper”)中得到一个异常;文本是否更新过一次?@JibranKhan如果setText出现某种错误,请选中编辑。是的,您正在从另一个线程更新主UI线程视图。使用主活动上下文更新
TextView
(coppertv)尝试记录异常,以防while循环中发生任何奇怪的情况。最好避免无声的捕捉@抱歉,我没听到那句话。它的设置如下:catch(Exception e){e.printStackTrace();}您可能在MainActivity.coppertv.setText(“Copper:+co.Copper”)中得到一个异常;文本是否更新过一次?@JibranKhan如果setText出现某种错误,请选中编辑。是的,您正在从另一个线程更新主UI线程视图。使用主活动上下文更新
文本视图
(coppertv)