【发布时间】:2015-09-25 17:23:02
【问题描述】:
我需要一些帮助。我正在制作这个应用程序来解析圣经并将其显示在 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 静态类的方法上放置了祝酒词。
顺序是:
1) getter 方法
2) 调用代码块(字符串)
3) 设置方法
据我了解,顺序应该是:首先是setter方法。因为它是从“sendJsonRequest”方法中调用的,然后是 getData 或 getter 方法,最后是调用方法。
这很糟糕,因为每次我调用 BackNextPassage 类时,我都会获取上次调用设置的数据。任何帮助将不胜感激 =)
ps:
L("一些随机文本");这些是正常的祝酒词,例如: 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;
}
}
再一次......这是调用该类的代码:
String previousPassage = BackNextGo.getInstance().getPassage(currentChapter, chapterSelected);
【问题讨论】:
-
不要做任何事
static! -
为了澄清上面的评论,当您的所有方法都是静态的时,通常表明您没有正确使用面向对象的原则。
-
根据我对您的问题的了解,您应该在发出请求后设置 proviousPassage。您可以使用从调用类传递到 getPassage 方法的接口来执行此操作。本质上它是一个回调。
-
我试试看,谢谢 =)
标签: java android methods static getter-setter