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);
我需要一些帮助。我正在制作这个解析圣经并将其显示在 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);