2017-04-17 10 views
0

私はこのようなコードを持っている:アプリケーションがクラッシュ

@Override 
public void onDrawOver(Canvas canvas, RecyclerView parent, RecyclerView.State state) { 
    drawGradient(canvas, parent); 
    drawStages(canvas, parent); 
} 

private void drawStages(final Canvas canvas, RecyclerView parent) { 
    final int parentLeft = parent.getPaddingLeft(); 
    final int parentRight = parentLeft + mLeftPadding + mIconSize + mRightPadding; 

    int childCount = parent.getChildCount(); 
    for (int i = 0; i < childCount - 1; i++) { 
     View child = parent.getChildAt(i); 

     LineupLayoutManager.LayoutParams params = 
       (LineupLayoutManager.LayoutParams) child.getLayoutParams(); 

     final int parentTop = child.getTop() + params.topMargin; 
     final int parentBottom = child.getBottom() + params.bottomMargin; 
     int height = parentBottom - parentTop; 

     final int paddingVertical = Math.round((height - mIconSize)/2); 

     try { 
      String link = findPlaceById(params.getPlaceId(),mStageList).getImg(); 
      Picasso.with(context).load(link).resize(150,150).into(new Target() { 
       @Override 
       public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { 
        final Drawable drawable = new BitmapDrawable(); 
        drawable.setBounds(parentLeft + mLeftPadding, parentTop + paddingVertical, 
          parentRight - mRightPadding, parentBottom - paddingVertical); 
        Canvas canvas1 = new Canvas(bitmap); 
        drawable.draw(canvas1); 
       } 

       @Override 
       public void onBitmapFailed(Drawable errorDrawable) { 

       } 

       @Override 
       public void onPrepareLoad(Drawable placeHolderDrawable) { 

       } 
      }); 
     } catch (IndexOutOfBoundsException e) { 
      Log.e(LOG_TAG, Log.getStackTraceString(e)); 
     } 
    } 
} 

全体のコードは、問題があるRecyclerView.ItemDecoration から拡張したクラス内にあること、私はそれを実行し、アプリ

Fatal signal 11 (SIGSEGV), code 1, fault addr 0x58 in tid 17542

また、bitmap.drawをrunOnUIThread()に挿入しようとしましたが、成功しませんでした。

少しの調査の後、私はピカソが何とかキャンバスを妨害していることを発見しました。つまり、ピカソのメソッドの外に置くと、すべてうまく動作します。

+0

完全なlogcat出力を投稿してください。 – csmckelvey

+0

問題はlogcatの出力がないことです、私はここに投稿しています。あなただけが表示されるエラー – Traabefi

+0

0x636f7d89(コード= 1)で[Android Fatal signal 11(SIGSEGV)]の重複の可能性があります。どのようにそれを追跡することができますか?](http://stackoverflow.com/questions/17840521/android-fatal-signal-11-sigsegv-at-0x636f7d89-code-1-how-can-it-be-tracked) – csmckelvey

答えて

0

私は今は仮定していますが、いつか先にcanvasへの参照が保存されているようです。 Bitmapを受け取った場合、このCanvasは既に何らかの形で無効にされている可能性があります。

実装の代わりにDrawableへの参照を保存し、Viewに再描画をリクエストしてください。 onDraw()の範囲内で、Drawableをパラメータとして指定したCanvasに引きます。

好きなように次の実装を調整してください。

BitmapDrawable drawable = null; 

private void drawStages(Canvas canvas, RecyclerView parent) { 
    if (drawable != null) { 
     int parentLeft = parent.getPaddingLeft(); 
     int parentRight = parentLeft + mLeftPadding + mIconSize + mRightPadding; 

     int childCount = parent.getChildCount(); 
     for (int i = 0; i < childCount - 1; i++) { 
      View child = parent.getChildAt(i); 

      LineupLayoutManager.LayoutParams params = 
        (LineupLayoutManager.LayoutParams) child.getLayoutParams(); 

      int parentTop = child.getTop() + params.topMargin; 
      int parentBottom = child.getBottom() + params.bottomMargin; 
      int height = parentBottom - parentTop; 

      int paddingVertical = Math.round((height - mIconSize)/2); 

      drawable.setBounds(parentLeft + mLeftPadding, parentTop + paddingVertical, 
        parentRight - mRightPadding, parentBottom - paddingVertical); 
      drawable.draw(canvas); 
    } else try { 
     String link = findPlaceById(params.getPlaceId(),mStageList).getImg(); 
     Picasso.with(context).load(link).resize(150,150).into(new Target() { 
      @Override 
      public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { 
       drawable = new BitmapDrawable(); 
       parent.invalidate() 
      } 

      @Override 
      public void onBitmapFailed(Drawable errorDrawable) { 
      } 

      @Override 
      public void onPrepareLoad(Drawable placeHolderDrawable) { 
      } 
     }); 
    } catch (IndexOutOfBoundsException e) { 
     Log.e(LOG_TAG, Log.getStackTraceString(e)); 
    } 
} 

編集:は、作業コードを追加しました。

private void drawStages(Canvas canvas, final RecyclerView parent) { 
    final int parentLeft = parent.getPaddingLeft(); 
    final int parentRight = parentLeft + mLeftPadding + mIconSize + mRightPadding; 

    int childCount = parent.getChildCount(); 
    for (int i = 0; i < childCount - 1; i++) { 
     View child = parent.getChildAt(i); 

     LineupLayoutManager.LayoutParams params = 
       (LineupLayoutManager.LayoutParams) child.getLayoutParams(); 

     final int parentTop = child.getTop() + params.topMargin; 
     final int parentBottom = child.getBottom() + params.bottomMargin; 
     int height = parentBottom - parentTop; 

     final int paddingVertical = Math.round((height - mIconSize)/2); 
     BitmapDrawable drawable; 
     if(drawables.size()!=0)drawable = drawables.get(i); 
     else drawable = null; 
     if(drawable!=null){ 
      drawable.setBounds(parentLeft + mLeftPadding, parentTop + paddingVertical, 
        parentRight - mRightPadding, parentBottom - paddingVertical); 
      drawable.draw(canvas); 
     } else { 
      String link = findPlaceById(params.getPlaceId(),mStageList).getImg(); 
      Picasso.with(context).load(link).resize(150,150).into(new Target() { 
       @Override 
       public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { 
        BitmapDrawable d = new BitmapDrawable(context.getResources(),bitmap); 
        drawables.add(d); 
        parent.invalidateItemDecorations(); 
       } 

       @Override 
       public void onBitmapFailed(Drawable errorDrawable) { 
       } 

       @Override 
       public void onPrepareLoad(Drawable placeHolderDrawable) { 
       } 
      }); 
     } 
    } 
} 
+0

どうすればいいですか?私はいくつかの大きなスニペットでコードを編集します – Traabefi

+0

これは何も描画されません、それは単にビューを無効にするだろうか? – Traabefi

+0

しかし、 'drawStages()'が再び呼び出され、if節がアクティブになります。 – tynn

関連する問題