2012-03-22 2 views
0

Я пытаюсь обновить текстовые представления, пока этот цикл обрабатывается. Вот мой код, который я использую для этой деятельности.Как правильно обновлять текстовые элементы в пользовательском интерфейсе Android?

public class StartDayActivity extends Activity { 
Data data_; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.startdayscreen);    


    Thread seperationTimer = new Thread(){ 
     public void run(){ 
      int seperationTimer = 5000; 
      int weatherAffect = 0; 
      int randomEventAffect = 0; 
      int locationTotalAvailable = 10; 
      //int servingTime = 3000; 
      int totalAvailableCustomers = (weatherAffect + randomEventAffect + locationTotalAvailable); 
      int dayTimer = (totalAvailableCustomers * seperationTimer); 
      int seperationTimerDay = 0; 
      int lemonadeSold = 11; 
      int totalDrinksSold = 0; 
      int pitcherSize = 12; 
      int totalLemonsUsed= 0; 
      int totalIceUsed =0; 
      int totalSugarUsed = 0; 
      int totalCupsUsed = 0; 
      double drinkPrice = 0.80; 

      try{      
       while(seperationTimerDay < dayTimer){ 
        sleep(seperationTimer); 
        seperationTimerDay = seperationTimerDay + seperationTimer; 
        lemonadeSold = lemonadeSold + 1; 
        totalDrinksSold += 1; 
        data_.cups_ -= 1; 
        totalIceUsed += 2; 

        if(lemonadeSold == pitcherSize){ 
         lemonadeSold = 0; 
         data_.lemons_ -= 4; 
         data_.sugar_ -= 2; 
         totalSugarUsed +=2; 
         totalLemonsUsed +=4;        
        } 
        if(data_.lemons_ == 0 || data_.ice_ == 0 || data_.sugar_ ==0 || data_.cups_ == 0){ 
         break; 
        } 

        updateView(); 
        Log.d("TAG", "for each : " + data_.ice_); 
        //calcMarketing(); 
       } 

        data_.day_gross_profit_ = (totalDrinksSold * drinkPrice); 
        data_.cash_ += (totalDrinksSold * drinkPrice); 
       Intent i = new Intent("com.game.lemonade.PLAYSCREEN"); 
       startActivity(i); 
      } 
      catch(InterruptedException e) 
      { 
       e.printStackTrace(); 
      } 
      finally{ 
       finish(); 
      } 

     } 
    }; 
    seperationTimer.start(); 
} 

@Override 
public void onStart(){ 
    super.onStart(); 
    data_ = getData(); 

} 
@Override 
public void onResume(){ 
    super.onResume(); 
    data_ = getData(); 
    //refreshDisplay(); 
} 

@Override 
public void onPause(){ 
    super.onPause(); 
    saveData(); 
    //refreshDisplay(); 
} 

@Override 
public void onConfigurationChanged(Configuration newConfig){ 
    super.onConfigurationChanged(newConfig); 
    //refreshDisplay(); 
} 

private Data getData() { 
    GameData player_data = new GameData(this); 
    player_data.open(); 
    Data game_state = new Data(player_data.getGameString()); 
    player_data.close(); 
    return game_state; 
    } 

private void saveData() { 
    GameData player_data = new GameData(this); 
    player_data.open(); 
    player_data.setGameString(data_.SerializeGame()); 
    player_data.close(); 

} 
private void updateView(){ 
    ((TextView)findViewById(R.id.lemonsLeftText2)).setText(
      (data_.lemons_)); 
} 
} 

Есть ли лучший способ попытаться это сделать? И как бы я хотел это сделать? Я получаю сообщение об ошибке, когда я делаю updateView(), чтобы попытаться обновить текст.

ответ

0

Вы не можете получить доступ к пользовательскому интерфейсу, используя потоки напрямую. Используйте либо AsyncTask, либо Handler для более длинных операций с потоком, которые влияют на пользовательский интерфейс.

Проверьте их;

http://developer.android.com/resources/articles/painless-threading.html

http://developer.android.com/reference/android/os/Handler.html

+0

Понял работает, используя Управляемый обработчик –

1

Сообщение об ошибке уже содержит ответ на ваш вопрос. Вы не можете обновлять пользовательский интерфейс из разных потоков - используйте runOnUIThread() для этого. И ради батареи - получите ссылку на textView в onCreate() и повторно используйте его.

+0

есть ли способ сделать это во время цикла и все же позволить ему спать в течение определенного периода времени, не используя нить? –

0

Вам не разрешено изменять внешний вид вашего View s из любой темы, которая не является основной нитью.

@ У Serdar есть несколько замечательных советов по его устранению.

Также вы должны избегать вызова findViewById() каждый раз, когда вам нужно вызвать setText(). findViewById() - довольно дорогостоящий вызов с точки зрения системных ресурсов. Чем меньше вызовов, чем вы сделаете, тем лучше ваше приложение будет работать.

Я предлагаю вам сделать ссылку на TextView и сделать вызов findViewById() внутри onCreate() и установить ссылку на то, что он возвращает вам. Затем в вашем методе updateView() вызовите что-то вроде yourTxt.setText("");

0

Хотя в ответах на другие вопросы был рассмотрен ответ на ваш вопрос, я укажу вам в этом разделе документации.

Threads

В частности, последняя часть.

Кроме того, набор инструментов Andoid UI не является потокобезопасным. Таким образом, вы не должны манипулировать своим пользовательским интерфейсом из рабочего потока - вы должны делать все манипуляции с пользовательским интерфейсом из потока пользовательского интерфейса. Таким образом, есть просто два правила для одной модели потоков Андроида:

  • Не блокировать поток пользовательского интерфейса
  • Не доступа инструментарий Android UI из вне потока пользовательского интерфейса

Два очень простые правила, но если вы будете придерживаться их, вы избежите много проблем.

0

Вы должны использовать Handler класс:

Где вы звоните:

updateView(); 

заменить:

myHandler.sendEmptyMessage(0); 

В обработчике:

private Handler myHandler=new Handler(){ 
    @Override 
    public void handleMessage(Message msg) { 
     if(msg.what==0){ 
      updateView(); 
     } 
    }; 
}; 
+0

для запуска нового намерения вы должны использовать тот же пример. myhandler.sendEmptyMessage (1); и добавьте «else if (msg.what == 1) {Intent ...;}" – ClarkXP

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