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



我创建了一个活动,在该活动中,我将一些记录插入到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
}

谢谢!

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

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

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

用户onResponse 中变量的setter方法

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

如果没有net额外的setter o getter,则需要验证字符串是否为空,或者只在该调用中打印其值。

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

这是我们在"活动"中需要的代码。

public void onResume(){
    super.onResume();
    getString(new VolleyCallback(){
        @Override
        public void onSuccess(String result){
            System.out.println(result); // returns the value of lastInsertId
        }
    });
}

相关内容

  • 没有找到相关文章

最新更新