2014-11-18 2 views
0

Я пытаюсь бесконечно петлю поток, но он работает только один раз. Единственные решения, которые я смог найти, - это более старая версия Java, которая, похоже, больше не работает.Бесконечно Looping Thread в Android

Вот активность, которая начинается цикл:

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 не обновляется, потому что я Раньше у нас была аналогичная проблема, но если это так, я не знаю, как решить проблему.

Заранее благодарим за любые решения/попытки решения.

EDIT:

У меня очень мало опыта работы с 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

Попробуйте зарегистрировать исключение в случае, если что-то странное произойдет внутри вашего цикла while. Лучше всего избегать тихих уловов! – LastFreeNickname

+0

@LastFreeNickname Прошу прощения, я пропустил эту линию. Он настроен следующим образом: catch (исключение e) { \t \t \t e.printStackTrace(); \t \t} – Tertles

+0

Возможно, вы получите исключение в MainActivity.coppertv.setText («Copper:» + co.copper); Обновляется ли текст один раз? –

ответ

1

Becareful, делая что-то вроде while(runGrowLoop == true), это займет много ресурсов процессора. Вы должны использовать блок synchronized.

Посмотрите здесь, у него уже есть ответ:

Android infinite loop in thread

1

Попробуйте с AsyncTask. Обновите свой вид через OnProgressUpdate Methode. Вы можете сделать свой материал в методе doInBackground, например.

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

Вы, конечно, есть исключения в:

MainActivity.coppertv.setText ("Медный:" + 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);} 
     }); 

обновить мнения.

Смежные вопросы