安卓Stackmob:提示已登录用户信息

3

我开始使用StackMob进行Android开发,但遇到了一个问题。在为用户创建登录界面后,我希望我的主页能够在顶部提示实际登录用户的名称。

所以我使用了getloggedInUser(Class<T>, stackMobCallBack<T>)方法来获取我的用户。第一个问题是我无法在回调外部获取此用户。因此,我创建了一个方法,从getloggedin user方法的回调中调用该方法。然后我又遇到了另一个问题:该方法的操作对我的视图没有影响。事实上,当主页提示时,文本保持不变(没有根据登录用户自适应更新)。奇怪的是,如果我减少应用程序然后恢复它,则文本会更新。以下是我的代码:

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方法来修复我的视图...但都没有成功。

1个回答

4

当您使用StackMob发出请求时,它将在不同的线程中运行(而非UI线程)。 当您想要修改/触摸/编辑UI时,您需要确保您的代码在UI线程中运行。 因此,在您的success方法中,您需要执行以下操作:

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

额外信息: 最好将所有活动扩展到一个活动(我们称其为BaseActivity),该活动应具备以下特点:

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

为什么要这样做呢? 这是为了确保当您重新打开应用程序时(从前台),StackMob始终会得到初始化。

非常感谢Ardo提供的解释。我明天会去检查它是否适用于我的应用程序,然后将其标记为解决方案。再次感谢您提供这个非常有意义的提示 :) - Pclaverie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接