【问题标题】:How do i use a variable outside the onResponse in Android?如何在 Android 的 onResponse 之外使用变量?
【发布时间】:2015-11-24 14:20:34
【问题描述】:

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

谢谢!

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 问题不在于代码本身。它在您的程序的逻辑中。如果您想使用 ID,您应该编写一个从 onResponse 调用的函数。
    • 不知道App的用途是做不到的。例如,为什么甚至需要 ID。你需要自己弄清楚那部分。
    • 我试图弄清楚它超过 4 个小时,但没有运气。我看了几十个帖子,没有一个符合我的要求。我想要的只是lastInsertId 变量在任何地方都具有相同的值,而不仅仅是在onResponse 方法中。我知道该变量是异步获取的,但我该如何实现呢?
    • 它/is/ 随处可到达(在您的班级中)。在到达您的 onResponse 回调之前,它不是 /set/ 。如果这个值对整个 Activity 的其余部分至关重要,那么您需要应用 ProgressDialog 或类似的东西来停止用户的进度,同时也显示应用正在做某事。
    【解决方案2】:

    在 onResponse 中使用变量的 setter 方法

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 您在哪里声明了您的VolleyCallback 类以及在哪里定义了callback 变量?
        • 这是MainActivity类中定义的接口。查看编辑后的帖子。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-06-15
        • 1970-01-01
        • 2021-09-16
        • 2018-02-26
        • 1970-01-01
        • 2017-04-01
        • 1970-01-01
        相关资源
        最近更新 更多