如何在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线程正在继续。 因此,执行顺序不符合代码在样本中出现的顺序。
- 请求队列已创建
- 请求已创建
- 请求添加到队列(也可能是启动HTTP调用)
- 打印出lastInsertId(null)
- lastInsertId是根据您的响应设置的
- 打印出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方法
- 如何使用libgdx获取手机语言?
- 加入MP3文件 – 将Java代码转换为Android
- Gradle Build对于任务应用程序失败:processReleaseResources
- 使用PageTransformer在嵌套片段中使用ViewPager的dispatchDraw上的Nullpointerexception
- 我不能在Mapbox中的自定义信息窗口中扩展视图。 (用图像设置getinfowindow)
- 错误:(59,8)错误:无法访问未找到android.support.v4.app.ActivityCompatApi23的ActivityCompatApi23类文件
- 在尝试将大型json数据发送到android中的服务器时出现OutOfMemoryException?
- BitmapFactory无法解码流:Android中的java.io.FileNotFoundException
- 在Android问题上播放带有MediaPlayer类的mp3