私は自分の問題を調査しましたが、これまでのところ誰もこの問題を経験していません。Android 用のアプリを開発しています。私のコードは、「TotalProductCount に値がありません」というメッセージを含む JSON 例外をスローしていますが、デバッグしない場合に限ります。コードが必要な場所にブレークポイントを配置すると、機能します。これが私のコードです:
InternetServices クラス:
public static ArrayList<ShoppingCart> GetItemFromBarcode(String barcode, String sessionKey, String shop) throws ClientProtocolException, IOException, JSONException {
ArrayList<ShoppingCart> shoppingCart = new ArrayList<ShoppingCart>();
if (shop.equals("Tesco")) {
String URL = "https://secure.techfortesco.com/groceryapi/restservice.aspx?command=PRODUCTSEARCH&page=1&sessionkey=" + sessionKey + "&searchtext=" + barcode;
_client = new DefaultHttpClient();
HttpGet get = new HttpGet(URL);
HttpResponse r = _client.execute(get);
int status = r.getStatusLine().getStatusCode();
if (status == 200) {
HttpEntity e = r.getEntity();
String data = EntityUtils.toString(e);
JSONObject items = new JSONObject(data);
if (items.getDouble("TotalProductCount") == 1) {
JSONArray products = items.getJSONArray("Products");
JSONObject item = products.getJSONObject(0);
shoppingCart.add(ConvertJSONtoShoppingCart(item));
}
else if (items.getDouble("TotalProductCount") == 0) {
//No product found
ShoppingCart error = new ShoppingCart();
error.setFailure(R.string.ShoppingItemReviewDialog_barcodeMessage);
shoppingCart.add(error);
}
else {
//More than one item found
int productCount = (int) items.getDouble("PageProductCount");
JSONArray products = items.getJSONArray("Products");
for (int i=0; i < productCount; i++) {
JSONObject item = products.getJSONObject(i);
shoppingCart.add(ConvertJSONtoShoppingCart(item));
}
}
}
else {
//connecting to internet failed
ShoppingCart error = new ShoppingCart();
error.setFailure(R.string.ShoppingItemReviewDialog_loginMessage);
shoppingCart.add(error);
}
}
return shoppingCart;
}
public static ShoppingCart ConvertJSONtoShoppingCart(JSONObject item) throws ClientProtocolException, IOException, JSONException {
ShoppingCart shoppingCart = new ShoppingCart();
shoppingCart.setItem(item.getString("Name"));
shoppingCart.setImage(item.getString("ImagePath"));
shoppingCart.setPrice(item.getDouble("Price"));
String temp = item.getString("OfferPromotion");
String offerString = temp.replaceAll("£", "£");
shoppingCart.setOffer(offerString);
//TODO find out how to receive the offer ID from the Tesco API
//shoppingCart.setOfferID(item.getString("OfferID"));
shoppingCart.setOfferID(item.getString("Name"));
String offer = item.getString("OfferValidity");
if (!offer.equals("") && !offer.equals(null)){
shoppingCart.setOfferStart(GetStartDateFromString(offer));
shoppingCart.setOfferEnd(GetEndDateFromString(offer));
}
return shoppingCart;
}
アクティビティ クラス: これは、別のスレッドで実行されているランナブルです。
public void run() {
synchronized (t) {
if (sessionKey != null && sessionKey != "") {
try {
potentialItems = InternetServices.GetItemFromBarcode(barcodeValue, sessionKey, theShoppingTrip.getShop());
} catch (ClientProtocolException e) {
ErrorOnThread errorOnThread = new ErrorOnThread(e.getMessage(), this);
handler.post(errorOnThread);
e.printStackTrace();
} catch (IOException e) {
ErrorOnThread errorOnThread = new ErrorOnThread(e.getMessage(), this);
handler.post(errorOnThread);
e.printStackTrace();
} catch (JSONException e) {
ErrorOnThread errorOnThread = new ErrorOnThread(e.getMessage(), this);
handler.post(errorOnThread);
e.printStackTrace();
}
}
else {
}
}
handler.post(returnRes);
synchronized (t)
{
t.interrupt();
}
}
これは、エラーが発生したときに UI スレッドにポストされるランナブルです。
private static class ErrorOnThread implements Runnable {
private final String errorMessage;
private final Context context;
ErrorOnThread(final String message, Context context) {
this.errorMessage = message;
this.context = context;
}
public void run() {
Toast toast = Toast.makeText(context, errorMessage, Toast.LENGTH_LONG);
toast.show();
}
}
JSON オブジェクトの例を次に示します。
{ "StatusCode": 0, "StatusInfo": "Processed and Logged OK", "PageNumber": 1, "TotalPageCount": 1, "TotalProductCount": 1, "PageProductCount": 1, "Products": [ { "BaseProductId": "51644502", "EANBarcode": "5000462001015", "CheaperAlternativeProductId": "", "HealthierAlternativeProductId": "", "ImagePath": "http://img.tesco.com/Groceries/pi/015/5000462001015/IDShot_90x90.jpg", "MaximumPurchaseQuantity": 99, "Name": "Tesco Still Water 2Ltr", "OfferPromotion": "", "OfferValidity": "", "OfferLabelImagePath": "", "Price": 0.45, "PriceDescription": "£0.02 each", "ProductId": "258016425", "ProductType": "QuantityOnlyProduct", "UnitPrice": 0.023, "UnitType": "100ml" } ] }
繰り返しますが、デバッグでそれに従うと、これはすべて完全に正常に機能するため、何が問題なのかを確認することは不可能です. 私はただ盲目で、明らかな何かが欠けていることを望んでいます。
これが理にかなっていることを願っています。ヘルプや提案をいただければ幸いです。ありがとうございました