我开始使用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);
}
}
我已经坚持了很长一段时间,我想这个问题与回调是一个异步方法这一事实有关,但我在视图中使用了各种方法,如invalide或postinvalidate方法来修复它。。。什么也没用。
当您使用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在您重新打开应用程序(从前台)时始终初始化。