2 a731896628 a731896628 于 2018.02.13 14:44 提问

这么久没人能帮我吗? Bmob服务器。在查询数据时只能异步查询,onSuccess出现脏数据 ,请问怎么解决?

一些片段代码

//定义个个获取查询出的数据的数量
private int carNum;

public int findCars(String goods_id, String user_id){
//--and条件1
BmobQuery eq1 = new BmobQuery("car");
eq1.addWhereEqualTo("goods_id", goods_id);
//--and条件2
BmobQuery eq2 = new BmobQuery("car");
eq2.addWhereEqualTo("user_id", user_id);
//整合成and条件
List> andQuerys = new ArrayList>();
andQuerys.add(eq1);
andQuerys.add(eq2);

//查询符合整个and条件的人
BmobQuery query = new BmobQuery("car");
query.and(andQuerys);

query.findObjects(context, new FindCallback() {
@Override
public void onSuccess(JSONArray arg0) {
Log.i("bmob", "for的legrnt::" + arg0.length() + "条数据。");
carNum=arg0.length();
}

@Override
public void onFailure(int arg0, String arg1) {
Log.i("bmob", "查询失败:");
}
});
Log.i("bmob", "count:" +carNum);
return carNum;
}

然后再另一个类中使用该方法,一个点击事件里
public void onClick(View v) {
//将商品的id和用户id存入数据库
if(User.getCurrentUser(context)== null){
Intent intent = new Intent(context, LoginActivity.class);
context.startActivity(intent);
}else {
//将商品的id存入数据库
CarDao carDao = new CarDao(context);
GoodsDao goodsDao=new GoodsDao(context);
//添加到购物车里
if(carDao.findCars(goodsId,user_id)<=0) {
Log.i("bmob", "进入for循环。。。。。。");
carDao.saveGoods(goodsId, User.getCurrentUser(context).getObjectId());
}else {
carDao.updateCar(carDao.getCarId(goodsId,user_id));
}
//商品可售数量减一
goodsDao.updateData(goodsId);
}
}

数据输出
for的legrnt::3
count:0

也就是说findCars(String goods_id, String user_id)方法中在onSuccess里成功对carNum赋值了,但是return回来后确实0.
在网上查了一些资料说是onSuccess异步加载的问题,
我试过用handler去获取,是可以获取得了在onSuccess里面的数据,但是handler里面的数据我又拿不出给主线程里的变量,还是为null
小弟我能力不够解决这个问题,这问题已经困扰我好几天天了,希望有大神可以帮下我。

4个回答

cai_niao_chao
cai_niao_chao   2018.02.26 14:27
已采纳

图片说明

qq_29360177
qq_29360177   2018.02.13 15:18

你好我是要成为海贼王的男人

qq_37748146
qq_37748146   2018.02.15 09:23

addQuerys应该在query后的 onSuccess里面再实现List添加元素 或者使用handler 您这样会导致前面查询未结束后面代码已经执行,导致空指针出现

a731896628
a731896628 是的,没错。就是这个问题,但是我需要的事解决问题的方法。
3 个月之前 回复
lemonCase
lemonCase   2018.02.24 17:26

取到数据后, 执行刷新ui的方法 Activity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
//todo
}
});

lemonCase
lemonCase 回复a731896628: 你把这句话丢到 onsuccessint i=carDao.findCars(goodsId,user_id);
3 个月之前 回复
a731896628
a731896628 确实,如果在onsuccess里通过更新适配器的话是可以将数据刷新到界面,但是一个问题是在主线程上赋值int i=carDao.findCars(goodsId,user_id); 这样的话i是空的,就是说carDao.findCars(goodsId,user_id)还没来得及查完数据,这句话就已经走完了。
3 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!