我如何在 Android 中的 onResponse 之外使用变量?
How do i use a variable outside the onResponse in Android?
我创建了一个 activity,我将一些记录插入到 mysql 数据库中。我声明了一个名为 lastInsertId
的全局变量。当我尝试 println
onResponse
方法内的变量时,工作正常但是当我尝试 println
方法外 returns null
时。我还需要在方法之外使用此变量。可以做什么?
这是我的代码:
String insertUrl = "http://localhost/file.php";
String lastInsertId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
StringRequest request = new StringRequest(Request.Method.POST, insertUrl, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
lastInsertId = response.toString();
System.out.println(lastInsertId); // returns the lastInsertId
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> parameters = new HashMap<String, String>();
// parameters
return parameters;
}
};
requestQueue.add(request);
System.out.println(lastInsertId); // get's null
}
谢谢!
它们是不同的结果,因为虽然您向本地 HTTP 服务器发出请求,但在您设置 lastInsertId 之前,最后一个 println 会触发。
你需要考虑多线程。您的 HTTP 请求在后台 运行,并且 UI 线程正在继续。所以执行顺序不是代码在您的示例中出现的顺序。
- 已创建请求队列
- 已创建请求
- 请求已添加到队列中(可能也开始 HTTP 调用)
- 打印出 lastInsertId(空)
- lastInsertId 根据您的回复设置
- 打印出 lastInsertId
在 onResponse
中使用你的变量的 setter 方法
发生这种情况是因为 lastInsertId
正在声明,但从未初始化,
然后 StringRequest request
通过匿名接口使用 回调 来打印值,这是异步发生的,但是您的代码正在继续并尝试在此之前打印值.
你没有额外的 setter 或 getter,你需要验证/字符串不为空,或者只在那个 callack 中打印它的值。
我明白了。大约一年后我回答了这个问题,因为我看到这个 post 有几百个访客。希望我的回答能帮助其他功能访问者从 onResponse 方法中获取数据。这是代码:
String insertUrl = "http://localhost/file.php";
String lastInsertId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
StringRequest request = new StringRequest(Request.Method.POST, insertUrl, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
lastInsertId = response.toString();
System.out.println(lastInsertId); // returns the lastInsertId
callback.onSuccess(lastInsertId);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> parameters = new HashMap<String, String>();
// parameters
return parameters;
}
};
requestQueue.add(request);
}
public interface VolleyCallback{
void onSuccess(ArrayList<Data> dataArrayList);
}
这是我们在 Activity.
中需要的代码
public void onResume(){
super.onResume();
getString(new VolleyCallback(){
@Override
public void onSuccess(String result){
System.out.println(result); // returns the value of lastInsertId
}
});
}
我创建了一个 activity,我将一些记录插入到 mysql 数据库中。我声明了一个名为 lastInsertId
的全局变量。当我尝试 println
onResponse
方法内的变量时,工作正常但是当我尝试 println
方法外 returns null
时。我还需要在方法之外使用此变量。可以做什么?
这是我的代码:
String insertUrl = "http://localhost/file.php";
String lastInsertId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
StringRequest request = new StringRequest(Request.Method.POST, insertUrl, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
lastInsertId = response.toString();
System.out.println(lastInsertId); // returns the lastInsertId
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> parameters = new HashMap<String, String>();
// parameters
return parameters;
}
};
requestQueue.add(request);
System.out.println(lastInsertId); // get's null
}
谢谢!
它们是不同的结果,因为虽然您向本地 HTTP 服务器发出请求,但在您设置 lastInsertId 之前,最后一个 println 会触发。
你需要考虑多线程。您的 HTTP 请求在后台 运行,并且 UI 线程正在继续。所以执行顺序不是代码在您的示例中出现的顺序。
- 已创建请求队列
- 已创建请求
- 请求已添加到队列中(可能也开始 HTTP 调用)
- 打印出 lastInsertId(空)
- lastInsertId 根据您的回复设置
- 打印出 lastInsertId
在 onResponse
中使用你的变量的 setter 方法发生这种情况是因为 lastInsertId
正在声明,但从未初始化,
然后 StringRequest request
通过匿名接口使用 回调 来打印值,这是异步发生的,但是您的代码正在继续并尝试在此之前打印值.
你没有额外的 setter 或 getter,你需要验证/字符串不为空,或者只在那个 callack 中打印它的值。
我明白了。大约一年后我回答了这个问题,因为我看到这个 post 有几百个访客。希望我的回答能帮助其他功能访问者从 onResponse 方法中获取数据。这是代码:
String insertUrl = "http://localhost/file.php";
String lastInsertId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
StringRequest request = new StringRequest(Request.Method.POST, insertUrl, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
lastInsertId = response.toString();
System.out.println(lastInsertId); // returns the lastInsertId
callback.onSuccess(lastInsertId);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> parameters = new HashMap<String, String>();
// parameters
return parameters;
}
};
requestQueue.add(request);
}
public interface VolleyCallback{
void onSuccess(ArrayList<Data> dataArrayList);
}
这是我们在 Activity.
中需要的代码public void onResume(){
super.onResume();
getString(new VolleyCallback(){
@Override
public void onSuccess(String result){
System.out.println(result); // returns the value of lastInsertId
}
});
}