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

时间:2015-11-24 14:20:35

标签: java android global-variables android-volley println

我创建了一个活动,其中我将一些记录插入到mysql数据库中。我声明了一个名为lastInsertId的全局变量。当我尝试println 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<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
}

谢谢!

4 个答案:

答案 0 :(得分:2)

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

你需要考虑多线程。您的HTTP请求正在后台运行,UI线程正在继续。因此,执行顺序不是代码出现在示例中的顺序。

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

答案 1 :(得分:0)

在onResponse

中使用变量的setter方法

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

我明白了。大约一年后我回答了这个问题,因为我看到这篇文章有几百名访客。希望我的回答能帮助其他功能访问者从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
        }
    });
}