我需要一些帮助。我正在制作这个解析圣经的应用程序,并将其显示在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);
答案 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);
祝你好运,快乐的编码。