【问题标题】:Running a Thread every time OnCreate is called每次调用 OnCreate 时运行一个线程
【发布时间】:2015-03-10 01:14:08
【问题描述】:

每次创建我的活动时,我都会尝试运行以下线程。它第一次工作,但如果我按下后退按钮并尝试再次导航到活动,它总是第二次崩溃。如何确保该线程每次都成功运行?

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:

public View getView(int position, View convertView, ViewGroup parent) {

    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: 线程退出未捕获异常 (group=0x41862da0) 03-09 21:33:01.550 18890-18890/com.example.andrewberkowitz.bae E/AndroidRuntime: 致命例外:主要 进程:com.example.andrewberkowitz.bae,PID:18890 java.lang.IndexOutOfBoundsException:索引 0 无效,大小为 0 在 java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) 在 java.util.ArrayList.get(ArrayList.java:308) 在 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(View.java:17594) 在 android.widget.RelativeLayout.measureChildHorizo​​ntal(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(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.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$DecorView.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(Choreographer.java:813) 在 android.view.Choreographer.doCallbacks(Choreographer.java:613) 在 android.view.Choreographer.doFrame(Choreographer.java:583) 在 android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java: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.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:515) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107) 在 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,暂停 25ms,共 25ms 03-09 21:33:02.201 18890-19449/com.example.andrewberkowitz.bae D/dalvikvm: GC_FOR_ALLOC 释放 83K,25% 释放 21018K/27848K,暂停 26ms,总共 26ms 03-09 21:33:02.381 18890-19449/com.example.andrewberkowitz.bae D/dalvikvm: GC_FOR_ALLOC 释放 30K, 22% free 21923K/27848K, 暂停 22ms, 总共 22ms

【问题讨论】:

  • 如果 largeImage 是一个 Array 或 HashMap,你需要同步访问它,这样多个线程不能同时调用 add()。
  • latch 确保我的 addtoView() 方法在执行后才被调用。
  • largeImage 是一个 ArrayList
  • 显示您的 logcat 应用程序崩溃的位置。我认为您需要在再次调用之前先停止或销毁它,因为您的线程将与您的 UI 线程分开运行
  • 把你的代码贴在你开始这个线程的地方,还有你的logcat

标签: android


【解决方案1】:

如果您导航回已创建的活动,则不会调用 onCreate。

尝试将您的代码移入 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();
}

【讨论】:

  • 问题不在于第二次调用线程没有被调用,而是第二次调用时它不起作用。
猜你喜欢
  • 2017-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-15
  • 1970-01-01
  • 2016-01-27
  • 1970-01-01
相关资源
最近更新 更多