Getter Setter 方法调用顺序错误

Getter Setter method being called at wrong order

我需要一些帮助。我正在制作这个解析圣经并将其显示在 webView 中的应用程序。 我在应用程序中实现了返回 next/passage 功能。它调用了正确的 json 地址,但是我在调​​用 getters 和 setters 的顺序上遇到了一些问题。

这是调用静态方法以获取字符串作为响应的代码块:

 String previousPassage = BackNextGo.getPassage
                    (currentChapter, chapterSelected);       
 L.m("previousPassage");

这是它调用的方法:

public class BackNextGo {

    private BackNextGo() {
    }

    private static String requestUrl;
    private static RequestQueue queue;

    private static String s;

    public static String getPassage(String data, int chapterSelected) {
        setRequestUrl(data, chapterSelected);
        queue = VolleySingleton.getInstance().getRequestQueue();
        sendJsonRequest();
        return getData();
    }

    private static void setRequestUrl(String s, int chapterSelected) {
        requestUrl = Constants.DISPLAY_DATA_URL_PART_1
                + s.replaceAll("\s+", "").replaceAll("(\d+)(?!.*\d)",
                        String.valueOf(chapterSelected))
                        + Constants.DISPLAY_DATA_URL_PART_2 + Constants.BIBLE_API_KEY;
    }

    private static String getRequestUrl() {
        return requestUrl;
    }

    private static void sendJsonRequest() {
        JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET,
                getRequestUrl(), new Response.Listener<JSONObject>() {

            @Override
            public void onResponse(JSONObject response) {

                if (response == null || response.length() == 0) {

                } else {

                    try {
                        setData(response
                                .getString(Constants.Keys.Books.KEY_SELECTED_CHAPTER));

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }

        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
            }
        });
        queue.add(request);
    }

    public static String getData() {
        counter++;
        L.m("getter method");
        return s;
    }

    private static void setData(String data) {
        s = data;
        L.m("setter method");
    }
}

我已经为 getter 和 setter 方法以及调用 BackNextPassage 静态方法 class.

祝酒词

顺序是:

1) getter 方法

2)调用代码块(String)

3) setter 方法

据我了解,顺序应该是:首先是 setter 方法。因为它是从 "sendJsonRequest" 方法中调用的,然后是 getData 或 getter 方法,最后是调用方法。

这很糟糕,因为每次我调用 BackNextPassage class 我都在获取上次调用设置的数据。任何帮助将不胜感激 =)

ps:

L("some random text");这些是正常的祝酒词,例如:Toast.makeText(context, ".......show();

更新!:

所以我尝试同步这些方法,但它只是挂起,直到应用程序崩溃... 这是我的代码:(也许有人可以指出我的错误?=))

public class BackNextGo {

private static BackNextGo instance = null;
private String requestUrl;
private RequestQueue queue;
private String s;

private BackNextGo() {
}

public static BackNextGo getInstance() {
    if (instance == null) {
        instance = new BackNextGo();
    }
    return instance;
}

public String getPassage(String data, int chapterSelected) {
    setRequestUrl(data, chapterSelected);
    queue = VolleySingleton.getInstance().getRequestQueue();
    synchronized (this) {
        sendJsonRequest();

        try {
            wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    return getData();
}

private void setRequestUrl(String s, int chapterSelected) {
    requestUrl = Constants.DISPLAY_DATA_URL_PART_1 + s.replaceAll("\s+", "").replaceAll("(\d+)(?!.*\d)", String.valueOf(chapterSelected)) + Constants.DISPLAY_DATA_URL_PART_2 + Constants.BIBLE_API_KEY;
    System.out.println(requestUrl);
}

private String getRequestUrl() {
    return requestUrl;
}

private void sendJsonRequest() {
    JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, getRequestUrl()
            , new Response.Listener<JSONObject>() {

        @Override
        public void onResponse(JSONObject response) {

            if (response == null || response.length() == 0) {

            } else {

                try {
                    setData(response.getString(Constants.Keys.Books.KEY_SELECTED_CHAPTER));

                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }

    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
        }
    });
    queue.add(request);
}

private void setData(String data) {
    synchronized (this) {
        s = data;
        notify();
    }
}

public String getData() {
    return s;
}
}

又一次...这是调用 class 的代码:

String previousPassage = BackNextGo.getInstance().getPassage(currentChapter, chapterSelected);

顺序:

1) getter method

2) calling code block (String)

3) setter method

没看错!预计..让我详细说明..


您假设不是这样,主要是因为顺序

sendJsonRequest(); // 'setter' method in here
return getData();  // 'getter' method here

正在呼叫中。

不过,sendJsonRequest()需要时间! 'setter' 方法仅在 onResponse(JSONObject response) 内调用,即当 JSON 请求已完成时。

因此,一旦 sendJsonRequest() 启动,下一行 return getData() 立即被调用!这就是 'getter' 出现在 'setter' 之前的原因,除非 JSONRequest 比它完成得更快(这不太可能)。

基本上,不要在发出JSON请求后立即尝试获取数据。您应该等待请求完成,并发出某种回调通知请求者数据已准备好,请求者可以使用 getData().

获取数据

所以在 BackNextGo 中创建您的界面

public class BackNextGo {

public interface OnData {
    public void updateData(String data);
}

private BackNextGo() {
}

private static String requestUrl;
private static RequestQueue queue;

private static String s;
private OnData sOnData = null;

public static String getPassage(String data, int chapterSelected, OnData onDataCallback) {
    sOnData = onDataCallback;
    setRequestUrl(data, chapterSelected);
    queue = VolleySingleton.getInstance().getRequestQueue();
    sendJsonRequest();
    return getData();
}

private static void setRequestUrl(String s, int chapterSelected) {
    requestUrl = Constants.DISPLAY_DATA_URL_PART_1
            + s.replaceAll("\s+", "").replaceAll("(\d+)(?!.*\d)",
                    String.valueOf(chapterSelected))
                    + Constants.DISPLAY_DATA_URL_PART_2 + Constants.BIBLE_API_KEY;
}

private static String getRequestUrl() {
    return requestUrl;
}

private static void sendJsonRequest() {
    JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET,
            getRequestUrl(), new Response.Listener<JSONObject>() {

        @Override
        public void onResponse(JSONObject response) {

            if (response == null || response.length() == 0) {

            } else {

                try {
                    setData(response
                            .getString(Constants.Keys.Books.KEY_SELECTED_CHAPTER));

                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }

    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
        }
    });
    queue.add(request);
}

public static String getData() {
    counter++;
    L.m("getter method");
    return s;
}

private static void setData(String data) {
    s = data;
    if(sOnData != null) {
        sOnData.updateData(data);
    }
    L.m("setter method");
}
}

然后在您的调用中 class 做类似...

String previousPassage;
OnData onDataCallback = new OnData {
    public void updateData(String data) {
        previousPassage = data;
    }
};
BackNextGo.getInstance().getPassage(currentChapter, chapterSelected, onDataCallback);