我如何 return 从 Volley 的 onResponse 函数中获取值?
How can I return value from function onResponse of Volley?
public class getString {
String tag_string_req = "string_raq";
String url = "http://10.0.2.2/eat/locations/index.json";
String result="";
public String get_String() {
StringRequest strReq = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
result=response;
System.out.println(response);
;
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
System.out.println(volleyError.getMessage());
}
});
AppController.getInstance().addToRequestQueue(strReq, tag_string_req);
return result;
}}
我想构建一个getString对象,在其他领域调用get_String。但似乎很难从 onResponse 中得到结果。我知道它不能以目前的方式工作。谁能帮我解决这个问题?
您想像这样使用回调接口:
public void getString(final VolleyCallback callback) {
StringRequest strReq = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
... // (optionally) some manipulation of the response
callback.onSuccess(response);
}
}...
}}
回调定义为
public interface VolleyCallback{
void onSuccess(String result);
}
activity中的示例代码:
public void onResume(){
super.onResume();
getString(new VolleyCallback(){
@Override
public void onSuccess(String result){
... //do stuff here
}
});
}
你也可以让VolleyCallback
更健壮,如果你想做处理就使用泛型类型,或者添加start()
、failed(Exception e)
、complete()
等方法来做更细粒度的状态检查。
请记住,这是一个异步调用,因此当您返回结果时(在 success()
内),您必须更新视图等。
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val rootView = inflater.inflate(R.layout.mission_fragment_list, container, false)
val recycler = rootView.findViewById(R.id.list) as RecyclerView
GlobalScope.async {
val queue = Volley.newRequestQueue(context)
val gson = Gson()
val url = "YPUR_API"
val stringRequest = StringRequest(
Request.Method.GET, url,
Response.Listener<String> { response ->
recycler.layoutManager = LinearLayoutManager(context)
val listType: Type = object : TypeToken<MutableList<MissionModel>?>() {}.type
val data: MutableList<MissionModel> = gson.fromJson(response, listType)
recycler.adapter = MissionAdapter(data)
},
Response.ErrorListener { error ->
error.printStackTrace()
})
queue.add(stringRequest)
}
return rootView
}
简单的代码。你需要添加依赖
实施 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.1.1'
正如 wblaschko 提到的一个非常好的解决方案,我可以理解这个解决方案对于那些经验较少的人来说可能有点混乱。在 wblaschko 的解决方案之上我编辑的解决方案下面:
VolleyCallback.java(界面)
public interface VolleyCallback {
void onSuccess(String result);
void onError(String result);
}
我创建了一个 HTTPRequest class 来保持整洁。
HTTPReq.java (Class)
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
public class HTTPReq {
public static StringRequest getRequest(String path, final VolleyCallback callback) {
// Instantiate the RequestQueue.
String url = "https:// **FILL HERE BASE API URL** /" + path;
// Request a string response from the provided URL.
StringRequest stringRequest = new StringRequest(Request.Method.GET, URL,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
// Display the first 500 characters of the response string.
callback.onSuccess(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
callback.onError(error.toString());
}
});
return stringRequest;
}
}
最后,在 activity 中,您要实现以下代码:
创建一个全局变量:
private RequestQueue mQueue;
之后,在activity的onCreate函数中申请一个VolleyRequestQue:
mQueue = Volley.newRequestQueue(this);
最后,实际执行 API 请求并可以捕获响应的函数:
mQueue.add(HTTPReq.getRequest( **FILL WITH PATH AND/OR PARAMS**, new VolleyCallback() {
@Override
public void onSuccess(String result) {
System.out.println(result);
}
@Override
public void onError(String result) {
System.out.println(result);
}
}));
希望这更清楚。
public class getString {
String tag_string_req = "string_raq";
String url = "http://10.0.2.2/eat/locations/index.json";
String result="";
public String get_String() {
StringRequest strReq = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
result=response;
System.out.println(response);
;
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
System.out.println(volleyError.getMessage());
}
});
AppController.getInstance().addToRequestQueue(strReq, tag_string_req);
return result;
}}
我想构建一个getString对象,在其他领域调用get_String。但似乎很难从 onResponse 中得到结果。我知道它不能以目前的方式工作。谁能帮我解决这个问题?
您想像这样使用回调接口:
public void getString(final VolleyCallback callback) {
StringRequest strReq = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
... // (optionally) some manipulation of the response
callback.onSuccess(response);
}
}...
}}
回调定义为
public interface VolleyCallback{
void onSuccess(String result);
}
activity中的示例代码:
public void onResume(){
super.onResume();
getString(new VolleyCallback(){
@Override
public void onSuccess(String result){
... //do stuff here
}
});
}
你也可以让VolleyCallback
更健壮,如果你想做处理就使用泛型类型,或者添加start()
、failed(Exception e)
、complete()
等方法来做更细粒度的状态检查。
请记住,这是一个异步调用,因此当您返回结果时(在 success()
内),您必须更新视图等。
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val rootView = inflater.inflate(R.layout.mission_fragment_list, container, false)
val recycler = rootView.findViewById(R.id.list) as RecyclerView
GlobalScope.async {
val queue = Volley.newRequestQueue(context)
val gson = Gson()
val url = "YPUR_API"
val stringRequest = StringRequest(
Request.Method.GET, url,
Response.Listener<String> { response ->
recycler.layoutManager = LinearLayoutManager(context)
val listType: Type = object : TypeToken<MutableList<MissionModel>?>() {}.type
val data: MutableList<MissionModel> = gson.fromJson(response, listType)
recycler.adapter = MissionAdapter(data)
},
Response.ErrorListener { error ->
error.printStackTrace()
})
queue.add(stringRequest)
}
return rootView
}
简单的代码。你需要添加依赖 实施 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.1.1'
正如 wblaschko 提到的一个非常好的解决方案,我可以理解这个解决方案对于那些经验较少的人来说可能有点混乱。在 wblaschko 的解决方案之上我编辑的解决方案下面:
VolleyCallback.java(界面)
public interface VolleyCallback {
void onSuccess(String result);
void onError(String result);
}
我创建了一个 HTTPRequest class 来保持整洁。
HTTPReq.java (Class)
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
public class HTTPReq {
public static StringRequest getRequest(String path, final VolleyCallback callback) {
// Instantiate the RequestQueue.
String url = "https:// **FILL HERE BASE API URL** /" + path;
// Request a string response from the provided URL.
StringRequest stringRequest = new StringRequest(Request.Method.GET, URL,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
// Display the first 500 characters of the response string.
callback.onSuccess(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
callback.onError(error.toString());
}
});
return stringRequest;
}
}
最后,在 activity 中,您要实现以下代码:
创建一个全局变量:
private RequestQueue mQueue;
之后,在activity的onCreate函数中申请一个VolleyRequestQue:
mQueue = Volley.newRequestQueue(this);
最后,实际执行 API 请求并可以捕获响应的函数:
mQueue.add(HTTPReq.getRequest( **FILL WITH PATH AND/OR PARAMS**, new VolleyCallback() {
@Override
public void onSuccess(String result) {
System.out.println(result);
}
@Override
public void onError(String result) {
System.out.println(result);
}
}));
希望这更清楚。