Сканирование штрих-кодов (ZXing) в собственном потоке и отображение ProgessDialog

так как я знаю эту сторону, большинство моих вопросов были найдены с помощью поиска. Но это, кажется, особенное.

Я новичок в разработке для Google Android, поэтому хочу учиться на практике. Я хочу создать приложение, которое сканирует штрих-коды и отображает список возможных продуктов. Я использую ZXing (получил это отсюда! ;)) для сканирования barcdes. Работает идеально. Я запрашиваю API-интерфейс Google с отсканированным штрих-кодом и получаю анализ RSS-канала, так как есть результат (но в большинстве случаев есть ^^).

Все это прекрасно работает. Но это занимает до четырех секунд после того, как я сканирую, приложение возвращается к моей деятельности. Это кажется очень длинным, не так ли? Поэтому я решил переместить часть сканирования в один поток, и при запросе результата от API должен быть ProgressDialog для пользователя, чтобы он знал, что там происходит.

Вот мой код:

public void onActivityResult(int requestCode, int resultCode, Intent intent) {  
      switch (requestCode) {
      case IntentIntegrator.REQUEST_CODE:
         if (resultCode == Activity.RESULT_OK) {

            IntentResult intentResult = 
               IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);

            if (intentResult != null) {
               String scannedCode = intentResult.getContents();
               String format = intentResult.getFormatName();

               //Gets information to the scanned product by the
               //Google-Shopping-API in form of a rss feed.
               AndroidFeedParser afp = new AndroidFeedParser("https://www.googleapis.com/shopping/search/v1/public/products?key=" +
                    AndroidFeedParser.API_KEY + "&country=DE&q=" + scannedCode + "&alt=" + AndroidFeedParser.FEED_CODE);

               //Parses the given rss feed and gives a FeedItem-List
               List<FeedItem> item = afp.parse();
               Toast toast = null;

               if(item.size() < 1) 
                   //products is NOT listed within the Google-Shopping-API
                   toast = Toast.makeText(this, "Dieses Produkt ist nicht in der Datenbank.", Toast.LENGTH_LONG);
                else 
                   //product is listed within the Google-Shopping-API
                   toast = Toast.makeText(this, item.get(1).getPrice().toString(), Toast.LENGTH_LONG);
               toast.show();
               Log.d("SEARCH_EAN", "OK, EAN: " + scannedCode + ", FORMAT: " + format);
            } else {
               Log.e("SEARCH_EAN", "IntentResult je NULL!");
            }
         } else if (resultCode == Activity.RESULT_CANCELED) {
            Log.e("SEARCH_EAN", "CANCEL");
         }
      } }

Я сказал тебе, это работает потрясающе. Но это занимает много времени, я думаю, что запрос к API стоит столько времени. Я надеюсь, что вы понимаете мой вопрос, и вы можете мне помочь! Я знаю, что должен быть реализован интерфейс Runnable и метод run(), но я не знаю, какую часть кода мне нужно отделить, чтобы заархивировать это желание выше. Пожалуйста помогите!

С уважением, Басти

(Извините за мой плохой английский, я из Германии)


person Basti    schedule 29.08.2011    source источник


Ответы (1)


Вы должны запустить новую асинхронную задачу из строки при создании AndroidFeedParser... но, может быть, ваше приложение уже готово? ;)

person inzKulozik    schedule 30.01.2012