0

私は自分の問題を調査しましたが、これまでのところ誰もこの問題を経験していません。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" } ] }

繰り返しますが、デバッグでそれに従うと、これはすべて完全に正常に機能するため、何が問題なのかを確認することは不可能です. 私はただ盲目で、明らかな何かが欠けていることを望んでいます。

これが理にかなっていることを願っています。ヘルプや提案をいただければ幸いです。ありがとうございました

4

2 に答える 2

0

わかりました、使用していた Android デバイスの電源を入れ直したところ、問題が解決したようです。

于 2013-08-25T12:56:49.710 に答える
0

js メソッド呼び出しがありますか。はいの場合は、コードをコールバック ブロックに入れることができます。そうすれば、メソッドによって書き込まれた後に値を確実に取得できます

于 2013-08-25T00:17:56.997 に答える