2015-03-10 4 views
0

Я пытаюсь запустить следующий поток каждый раз, когда моя активность создана. Он работает в первый раз, но если я нажму кнопку «Назад» и попытаюсь перейти к активности снова, он всегда сбрасывается во второй раз. Как я могу убедиться, что этот поток успешно запускается каждый раз?Выполнение потока каждый раз, когда OnCreate называется

new Thread(new Runnable() { 

       public void run() { 

        for (int i = 0; i < 5; i++) { 

         try { 
          URL url = new URL(priceRangeLargeImageString[i]); 
          HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
          connection.setDoInput(true); 
          connection.connect(); 
          InputStream input = connection.getInputStream(); 
          Bitmap bitmap = BitmapFactory.decodeStream(input); 
          largeImage.add(bitmap); 

         } catch (IOException e) { 
          e.printStackTrace(); 
          Log.e("Exception", e.getLocalizedMessage()); 
         } 
        } 
        latch.countDown(); 
       } 
      }).start(); 

       try { 
        latch.await(); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       addtoView(); 

Мой поток заселение в ArrayList, который я помещаю в пользовательский адаптер здесь:

общественное мнение GetView (интермедиат положение, Вид convertView, ViewGroup родитель) {

if (convertView == null) { 
     convertView = inflater.inflate(R.layout.forlist, parent, false); 

    } 

    // parent.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); 

    TextView address = (TextView) convertView.findViewById(R.id.Address); 
    address.setText(flowername.get(position)); 

    TextView price = (TextView) convertView.findViewById(R.id.price); 

    price.setText("$" + flowerprice.get(position), TextView.BufferType.SPANNABLE); 
    Spannable spannable = (Spannable) price.getText(); 
    spannable.setSpan(STRIKE_THROUGH_SPAN, 0, price.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 

    TextView discount = (TextView) convertView.findViewById(R.id.discountPrice); 

    discountedPrice = Double.parseDouble(flowerprice.get(position))/1.15; 
    String priceString = new DecimalFormat("$##.00").format(discountedPrice); 
    discount.setText(priceString); 

    TextView size = (TextView) convertView.findViewById(R.id.sizes); 
    size.setText(flowersize.get(position)); 

    final ImageView image = (ImageView) convertView.findViewById(R.id.flowerImage); 
    image.setImageBitmap(flowerimage.get(position)); 

    return convertView; 
} 

Мой LogCat заключается в следующем:

03-09 21: 33: 01.540 18890-18890/com.example.andrewberkowitz.bae W/dalvikvm: threadid = 1: поток, выходящий с неперехваченным исключением (группа = 0x41862da0) 03-09 21: 33: 01.550 18890-18890/com.example.andrewberkowitz.bae E/AndroidRuntime: FATAL EXCEPTION: main Процесс: com.example.andrewberkowitz.bae, PID: 18890 java.lang.IndexOutOfBoundsException: Недействительный index 0, размер 0 at java.util.ArrayList.throwIndexOutOfBoundsException (ArrayList.java:255) at java.util.ArrayList.get (ArrayList.java:308) at com.example.andrewberkowitz.bae.FlowerShopAdapter. getView (FlowerShopAdapter.java:106) на android.widget.AbsListView.obtainView (AbsListView.java:2780) на android.widget.ListView.measureHeightOfChildren (ListView.java:1274) на android.widget.ListView.onMeasure (ListView.java:1186) на android.view.View.measure (Просмотреть .java: 17594) на android.widget.RelativeLayout.measureChildHorizontal (RelativeLayout.java:719) на android.widget.RelativeLayout.onMeasure (RelativeLayout.java:455) на android.view.View.measure (View.java : 17594) на android.view.ViewGroup.measureChildWithMargins (ViewGroup.java:5398) на android.widget.FrameLayout.onMeasure (FrameLayout.java:310) на android.view.View.measure (View.java:17594) на android.view.ViewGroup.measureChildWithMargins (ViewGroup.java:5398) в android.support.v7.internal.widget.ActionBarOverlayLayout.onMeasure (ActionBarOverlayLayout.java:453) в android.view.View.measure (Просмотреть .java: 17594) at android.view.ViewGroup.measureChildWith Поля (ViewGroup.java:5398) на android.widget.FrameLayout.onMeasure (FrameLayout.java:310) на android.view.View.measure (View.java:17594) на android.view.ViewGroup.measureChildWithMargins (ViewGroup.java:5398) на android.widget.LinearLayout.measureChildBeforeLayout (LinearLayout.java:1410) в android.widget.LinearLayout.measureVertical (LinearLayout.java:695) в android.widget.LinearLayout.onMeasure (LinearLayout. java: 588) на android.view.View.measure (View.java:17594) на android.view.ViewGroup.measureChildWithMargins (ViewGroup.java:5398) на android.widget.FrameLayout.onMeasure (FrameLayout.java: 310) на com.android.internal.policy.impl.PhoneWindow $ D ecorView.onMeasure (PhoneWindow.java:2588) на android.view.View.measure (View.java:17594) на android.view.ViewRootImpl.performMeasure (ViewRootImpl.java:2308) на android.view.ViewRootImpl. measureHierarchy (ViewRootImpl.java:1409) на android.view.ViewRootImpl.performTraversals (ViewRootImpl.java:1610) на android.view.ViewRootImpl.doTraversal (ViewRootImpl.java:1267) на android.view.ViewRootImpl $ TraversalRunnable.run (ViewRootImpl.java:6638) на android.view.Choreographer $ CallbackRecord.run (Хореограф.java:813) на android.view.Choreographer.doCallbacks (Хореограф.java:613) на android. view.Choreographer.doFrame (Хореограф.java:583) на android.view.Choreographer $ FrameDisplayEventReceiver.run (Хореограф.ява: 799) на android.os.Handler.handleCallback (Handler.java:733) на android. os.Handler.dispatchMessage (Handler.java:95) на android.os.Looper.loop (Looper.java:146) на android.app.ActivityThread.main (ActivityThread.java:5635) на java.lang. отражать. Метод.invokeNative (родной метод) по адресу java.lang.reflect.Method.invoke (M ethod.java:515) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1291) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1107) at dalvik.system.NativeStart.main (родной метод) 03-09 21: 33: 01.830 18890-19449/com.example.andrewberkowitz.bae D/dalvikvm: GC_FOR_ALLOC освобожден 792K, 31% бесплатно 19230K/27848K, приостановлено на 25 мс, всего 25 мс 03-09 21: 33: 02.201 18890-19449/com.example.andrewberkowitz.bae D/dalvikvm: GC_FOR_ALLOC освобожден 83K, 25% бесплатно 21018K/27848K, приостановлено 26 мс, всего 26 мс 03-09 21: 33: 02.381 18890-19449/com.example.andrewberkowitz.bae D/dalvikvm: GC_FOR_ALLOC освобожден 30K, 22% бесплатно 21923K/27848K, приостановлено 22 мс, всего 22 мс

+0

Что такое 'latch'? – oltman

+0

Если largeImage является массивом или HashMap, вам необходимо синхронизировать с ним доступ, чтобы несколько потоков не могли одновременно вызвать функцию add(). – lamflam

+0

защелка гарантирует, что мой метод addtoView() не будет вызываться до тех пор, пока не будет выполнен протектор. – Andrew

ответ

0

onCreate is not ca lled, если вы перейдете к уже созданному действию.

попробуйте переместить свой код в onResume():

@Override 
protected void onResume(){ 
    super.onResume(); 
new Thread(new Runnable() { 

      public void run() { 

       for (int i = 0; i < 5; i++) { 

        try { 
         URL url = new URL(priceRangeLargeImageString[i]); 
         HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
         connection.setDoInput(true); 
         connection.connect(); 
         InputStream input = connection.getInputStream(); 
         Bitmap bitmap = BitmapFactory.decodeStream(input); 
         largeImage.add(bitmap); 

        } catch (IOException e) { 
         e.printStackTrace(); 
         Log.e("Exception", e.getLocalizedMessage()); 
        } 
       } 
       latch.countDown(); 
      } 
     }).start(); 
} 
+0

Проблема не в том, что нить не называется во второй раз, так это то, что она не работает, когда она называется второй раз. – Andrew

Смежные вопросы