3

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

所以我使用 getloggedInUser (Class<T>, stackMobCallBack<T>) 来获取我的用户。第一个问题是我无法让这个用户在回调之外。因此,我创建了一个从 getloggedin 用户方法的 callBack 调用的方法。在那里我进入了另一个问题;该方法的操作对我的观点没有影响。实际上,当主页提示时,文本保持不变(不适应登录用户)。奇怪的是,如果我减少我的应用程序然后恢复它,文本就会更新。这是我的代码:

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

1 回答 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。

于 2013-12-02T23:13:56.763 回答