2013-12-01 3 views
3

Я начал использовать stackmob для разработки Android. И я пошел в проблему. В самом деле, после создания интерфейса для входа в систему я хотел, чтобы моя домашняя страница запрашивала имя пользователя, которое было зарегистрировано в верхней части страницы.Android Stackmob: Запрос информации о пользователе

Таким образом, я использовал getloggedInUser (класс < T>, stackMobCallBack < T>) для получения моего пользователя. Первая проблема заключалась в том, что я не смог получить этого пользователя за пределами обратного вызова. Поэтому я создал метод, который я вызываю из callBack пользовательского метода getloggedin. Там я пошел в другой вопрос; действие этого метода не повлияло на мое мнение. Действительно, когда запрашивается домашняя страница, текст остается неизменным (не приспосабливаясь к зарегистрированному пользователю). Странно, что если я уменьшу свое приложение и затем его возобновит, текст будет обновлен. Вот мой код:

public class MainActivity extends Activity { 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     StackMobAndroid.init(getApplicationContext(), 0, 
          "XXXXX.XXXXXX.XXXXX"); 

     TextView welcomeText = (TextView) findViewById(R.id.welcomeHead); 
     User.getLoggedInUser(User.class,new StackMobQueryCallback<User>(){ 

      public void failure(StackMobException e) { 

       // TODO Auto-generated method stub 
      } 

      public void success(List<User> list) { 

       User loggedUserf = list.get(0); 
       setMyAppUser(loggedUserf); 
       finish(); 
      } 
     }); 

     public void setMyAppUser(User user){ 
      String welcome = welcomeText.getText().toString(); 
      welcome = welcome+" "+user.getUsername(); 
      welcomeText.setText(welcome); 
     } 
    } 

Я застрял на нем в течение длительного времени, и я думаю, что проблема связана с тем, что обратным вызовом является асинхронным методом, но я использовал все виды вещей, как invalidate или postinvalidate на моем представлении для его исправления ... ничего не получилось.

ответ

4

Когда вы делаете запросы с помощью StackMob, он будет работать в другом потоке (а не в потоке пользовательского интерфейса). Вам нужно будет убедиться, что ваш код работает в потоке пользовательского интерфейса, если вы хотите изменить/коснуться/изменить свой пользовательский интерфейс. Таким образом, в методе success, вам нужно сделать:

runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
    setMyAppUser(loggedUserf); 
    } 
}); 

Extra: Лучше всего, чтобы все ваши действия, чтобы расширить деятельность (назовем его BaseActivity), который имеет:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if (StackMob.getStackMob() == null) 
     StackMobAndroid.init(getApplicationContext(), 0, "XXXX"); 
    } 

Почему? Просто убедитесь, что StackMob всегда будет инициализирован при повторном открытии приложения (с переднего плана).

+0

Большое спасибо Ардо за это объяснение. Я завтра выберу, чтобы увидеть, как он работает над моим приложением или нет, и тогда я буду отмечать его как решение. И спасибо за этот очень полезный отзыв :) – Pclaverie

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