以错误的顺序调用Getter Setter方法

时间:2015-07-08 00:55:19

标签: java android methods static getter-setter

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

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

 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静态类的方法上放置了toast。

,订单是:

1)getter方法

2)调用代码块(String)

3)setter方法

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

这很糟糕因为我每次调用BackNextPassage类时都会通过上次调用获取数据集。任何帮助将不胜感激=)

PS:

L(“一些随机文本”);这些是正常的敬酒,如:Toast.makeText(context,“........ show();

UPDATE:

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

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;
}
}

再次......继续调用该类的代码:

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

2 个答案:

答案 0 :(得分:4)

订单:

  

1)getter方法

     

2)调用代码块(String)

     

3)setter方法

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


你假设不然,主要是因为订单

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

正在被召唤。

然而,sendJsonRequest()需要时间! 'setter'方法仅在onResponse(JSONObject response)内调用,也就是说,当JSONRequest完成时。

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

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

答案 1 :(得分:1)

所以在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");
}
}

然后在你的通话类中执行类似......

的操作
String previousPassage;
OnData onDataCallback = new OnData {
    public void updateData(String data) {
        previousPassage = data;
    }
};
BackNextGo.getInstance().getPassage(currentChapter, chapterSelected, onDataCallback);
祝你好运,快乐的编码。