如何在一个有返回值的方法中进行网络操作,然后返回网络操作后的值?
比如
private String A(){
StringRequest stringRequest=new StringRequest(Request.Method.POST, MyApplication.HOST + "/mobileLogin.do",
new Response.Listener<String>() {
@Override
public void onResponse(String s) {
sout("获取的"+s)
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String,String> map=new HashMap<>();
map.put("msgno","001010");
map.put("uid",s);
return super.getParams();
}
};
requestQueue.add(stringRequest);
}
我想返回这个获取的结果,但是volley的操作是在异步,根本没法return,那这个怎么办
黄舟2017-04-18 09:42:00
可以使用介面回呼
先聲明一個介面
public interface RequestCallback{
void onSuccess(String data);
void onFail(String error);
}
然後在方法內使用
private String A(RequestCallback callback){
StringRequest stringRequest=new StringRequest(Request.Method.POST, MyApplication.HOST + "/mobileLogin.do",
new Response.Listener<String>() {
@Override
public void onResponse(String s) {
sout("获取的"+s)
if(callback!=null){
callback.onSuccess(s);
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
if(callback!=null){
callback.onFail(volleyError.getMessage);
}
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String,String> map=new HashMap<>();
map.put("msgno","001010");
map.put("uid",s);
return super.getParams();
}
};
requestQueue.add(stringRequest);
}
巴扎黑2017-04-18 09:42:00
你可以換種思路,不需要再volley
中返回结果。当请求成功后对结果进行封装,例如直接使用List
或者结合类进行存储,然后可以通过Handler
機制從中取得資料與操作。
ringa_lee2017-04-18 09:42:00
我是使用融雲的時候需要用戶資訊提供者,根據他的方法傳過來的stringId,我再使用這個id從我的伺服器獲取這個id對應的資訊,,,所以沒辦法先操作volley,
RongIM.setUserInfoProvider(new RongIM.UserInfoProvider() {
@Override
public UserInfo getUserInfo(final String s) {
volley操作,需要使用到s
PHP中文网2017-04-18 09:42:00
可以直接用Handler啊
我重新看了一下你的問題,好像涉及到多層回調吧,這裡我覺得用RxAndroid比較適合
//假设已经有两个方法,getStringID()用于获取你的用户id
//getUserInfo(String s)根据传入的StringID从你的服务器上获取用户信息
//UserInfo是用户信息类
Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext(getStringID());//获取id
}
})
.map(new Func1<String, String>() {
@Override
public String call(String s) {
//如果你要处理得到的StringID的话,写在这里,否则不用写
return s;
}
})
.flatMap(new Func1<String, Observable<UserInfo>>() {
@Override
public Observable<UserInfo> call(String s) {
//这个s就是上面return的
//返回一个包裹着UserInfo的Observable
return Observable.just(getUserInfo(s));
}
})
.subscribeOn(Schedulers.io())//这段代码上面的都会在子线程中工作
.observeOn(AndroidSchedulers.mainThread())//这段代码下面的会在主线程中工作
.subscribe(new Action1<UserInfo>() {
@Override
public void call(UserInfo userInfo) {
//你想对UserInfo进行的操作,比如显示个用户名啥的
}
});
剛接觸不久,寫出來的程式碼不大好看。 。 。求大牛指導