附上代码:
successBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
checkEmailIsUse(inputUserEmailEt);//此处是进行网络请求,获得返回数据
Log.d(TAG, "onClick: "+emailCanuse);
switch (status){
case 200:
if(!emailCanuse){
showDialog();
}
else {
Toast.makeText(getContext(),"账号不存在,请重新确认!",Toast.LENGTH_SHORT).show();
}
break;
}
}
});
我想进行的操作是,利用网络请求获取的值,判断其是否符合条件,再进行弹框操作,但是问题是第一次点击没有反应而且emailCanuse的值为初始化的值且打印不了,第二次点击才有反应和正确赋值和调用里面的dialog
网络请求方面利用Gson解析返回的json数据:
CheckEmail ce = new CheckEmail();
Gson gson = new Gson();
ce = gson.fromJson(resData,CheckEmail.class);
status = ce.getStatus();
emailCanuse = ce.getData();
在这里获取到的值打印出来是正确的。
到底是什么原因啊?!!!求解答啊!!
checkEmailIsUse(inputUserEmailEt);这个方法估计是另开线程进行网络访问,网络访问是延时操作,emailCanuse是网络请求结果,你这里是switch直接写在checkEmailIsUse(inputUserEmailEt)后面就是switch跟网络访问线程同时进行,基于网络访问是演示操作,99%的可能switch完了,网络访问结果还没有得到,所你的结果打印是空,第二次点击才有是因为你打印的是第一次的结果,你应该这样checkEmailIsUse(inputUserEmailEt,callback(){});,在网络访问中加一个回调,在回调中进行结果的处理
都说了 因为 checkEmailIsUse(inputUserEmailEt)里面是一个线程的关系,所以不会等里面的东西都运行完了才会进行下一句,所以直接跳到下一句,switch完了你的线程还没完,因为里面的网络访问是延时操作。所以导致你第一次的switch完了你的访问结果还没出来,而第二次的话显示的是第一次的结果
button的onclick函数里只调用请求网络获取数据,status状态的判断放到网络数据返回的回调里去
简单来说就是你要对网络结果进行操作就要在访问线程里做一个回调,在回调里进行操作
checkEmailIsUse(inputUserEmailEt);这个方法估计是另开线程进行网络访问,网络访问是延时操作,emailCanuse是网络请求结果,你这里是switch直接写在checkEmailIsUse(inputUserEmailEt)后面就是switch跟网络访问线程同时进行,基于网络访问是演示操作,99%的可能switch完了,网络访问结果还没有得到,所你的结果打印是空,第二次点击才有是因为你打印的是第一次的结果,你应该这样checkEmailIsUse(inputUserEmailEt,callback(){});,在网络访问中加一个回调,在回调中进行结果的处理