Bmob中BmobQuery查询数据后将值传递给全局变量
刚开始接触Bmob时,通过BmobQuery查询的数据无法赋值给全局变量,通过网上查资料得知Bmob的查询操作是异步线程,异步线程中的值无法直接赋给全局变量!有些大佬通过Handler+message的方法可以实现,我借鉴了一下,但是没成功,也找不到BUG。后来了解到可以使用接口回调,于是一番搜索后,终于得以实现。这里记录一下
这里我主要是想获取数据库中已存用户的ObjectID,将ObjectID传到MainActivity中方便使用。
###1>这里我建了一个用户工具类PersonUtil
/**
* 用户工具类,用于实现用户的增删查改
*/
public class PersonUtil {
static String TAG = "PersonUtil";
/**
* 通过用户账户查询用户ID
*/
public static void queryObjiectID(String mPhoneNumber){
String sql = "select * from Person where phoneNumber = ?";//查询用户ID
new BmobQuery<Person>().doSQLQuery(sql, new SQLQueryListener<Person>() {
@Override
public void done(BmobQueryResult<Person> bmobQueryResult, BmobException e) {
if(e == null){
List<Person> list = bmobQueryResult.getResults();
person1.getPersonList(list); //将查询得到的list传入
}else {
Log.i(TAG, "done: 查询ID错误"+e.getMessage());
}
}
}, mPhoneNumber);
}
private static IPerson person1;
/**
* setIUserListener()方法,想在那里获取查询得到的list就在那里调用
*/
public static void setIPersonListener(IPerson person2){
person1= person2;
}
/**
* 定义接口
*/
public interface IPerson{
void getPersonList(List<Person> list);
}
}
###2>这里是MainActivity,我希望通过工具类PersonUtil查询用户ObjectID,并将ObjectID赋值给MainActivity的全局变量。
public class MainActivity extends AppCompatActivity{
static String TAG = "MainActivity";
String phoneNumber = "12344556";
String ID = ""; //接收查询到的ObjectID
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化Bmob
Bmob.initialize(MainActivity.this, "Application_KEY");
//查询用户ID
PersonUtil.queryObjiectID(phoneNumber);
//调用setIUserListener
PersonUtil.setIPersonListener(new PersonUtil.IPerson(){
@Override
public void getPersonList(List<Person> list) {
if(list.size() == 0){
//没有查找到该用户ID
Log.i(TAG, "getUser:该用户未注册");
}else{
ID = list.get(0).getObjectId();
Log.i(TAG, "getUser:该用户ObjectID为:"+ID);
//Toast.makeText(getApplicationContext(), ID, Toast.LENGTH_SHORT).show();
}
}
});
}
###这样就可以实现将BmobQuery查询得到的数据赋值给全局变量。