如何在Android中的onResponse之外使用变量?

我创建了一个活动,在其中我将一些记录插入到mysql数据库中。 我声明了一个名为lastInsertId的全局变量。 当我尝试在onResponse方法中onResponse变量时,工作正常,但是当我尝试println ,方法返回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() { @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 getParams() throws AuthFailureError { Map parameters = new HashMap(); // parameters return parameters; } }; requestQueue.add(request); System.out.println(lastInsertId); // get's null } 

谢谢!

它们是不同的结果,因为虽然您正在向本地HTTP服务器发出请求,但在设置lastInsertId之前,您的上一个println会触发。

你需要考虑multithreading。 您的HTTP请求正在后台运行,UI线程正在继续。 因此,执行顺序不符合代码在样本中出现的顺序。

  1. 请求队列已创建
  2. 请求已创建
  3. 请求添加到队列(也可能是启动HTTP调用)
  4. 打印出lastInsertId(null)
  5. lastInsertId是根据您的响应设置的
  6. 打印出lastInsertId

发生这种情况是因为lastInsertId正在声明,但从未初始化,然后StringRequest request通过匿名接口使用回调来打印值,这是以异步方式发生的,但是您的代码正在前进并且尝试在此之前打印值发生。

你不需要额外的setter getter,你需要validation/该字符串不为空,或者只在该callack中打印它的值。

我明白了。 大约一年后我回答了这个问题,因为我看到这篇文章有几百名访客。 希望我的回答能帮助其他function访问者从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() { @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 getParams() throws AuthFailureError { Map parameters = new HashMap(); // parameters return parameters; } }; requestQueue.add(request); } public interface VolleyCallback{ void onSuccess(ArrayList 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 } }); } 

用户在onResponse中使用变量的setter方法