2013-08-13 7 views
9

私はを取得しています。IllegalStateException:リストア例外でアンダーフロー、が原因でアプリケーションがクラッシュする これはアンドロイド4.3のアップデート後に起こり始めました。アンドロイド3.0 - 4.2.xでは正常に動作します。アンドロイドのリストアでアンダーフロー4.3

private void doDraw(Canvas canvas) { 
     if(mTickerBackGround!=null && (!mTickerBackGround.isRecycled())){ 
      canvas.drawBitmap(mTickerBackGround, 0, 0, null); 
     } 
     if((mBitMapBuffer!=null)){ 
      canvas.save(); 
      canvas.translate(mX, 0); 
      if(!mBitMapBuffer.isRecycled()){ 
       canvas.drawBitmap(mBitMapBuffer, 0, 0, null); 
      } 
      canvas.restore(); 

      if(bitMapWidth+mX<mCanvasWidth){ 
       canvas.translate(bitMapWidth+mX, 0);  
       if(!mBitMapBuffer.isRecycled()){ 
        canvas.drawBitmap(mBitMapBuffer, 0, 0, null); 
       } 
       canvas.restore();     
      } 

      if(bitMapWidth+mX<=0){ 
       mX = 0; 
      }else if(Math.abs(mX)>(bitMapWidth)){     
       mX= mCanvasWidth; 
      } 

      mX-=TickerConstants.SCROLLING_SMOOTHNESS*density;; 
     } 
     if(mLogo!=null && (!mLogo.isRecycled())){ 
      canvas.drawBitmap(mLogo, mCanvasWidth-(60*density), mLogo.getHeight()/6, null); 
     } 
    } 

私の質問は私の描画コード

例外は下記の二

canvas.restore(); 

に起こる

  1. このエラーの意味は何ですか?
  2. このエラーを修正するにはどうすればよいですか?

スタックトレースメッセージが生成されます。ライン165は、第canvas.restore()に対応

8月13日18:13:09.083:E/AndroidRuntime(14139):致命的な例外: スレッド506 8月13日18:13:09.083:E/AndroidRuntime(14139): とandroid.graphics.Canvas.restore(ネイティブメソッド)08-13 18:13:09.083:E/AndroidRuntime(14139): で、083のリストアでアンダーフローが発生しました08-13 18:13:09.083: java.lang.IllegalStateException: 13:09.083: E/AndroidRuntime(14139): com.my.package.name.ticker.TickerSurfaceView $ TickerThread.doDraw(TickerSurfaceView.java:165) 08-13 18:13:09.083:E/AndroidRuntime 14139): com.my.package.name.ticker.TickerSurfaceView $ TickerThread.run (TickerSurfaceView.java:128)

+0

スタックトレース全体を送信してください。 – CommonsWare

+0

スタックトレースを追加 – prashant

答えて

13

バグは、コードのこのセクションにあります。

if(bitMapWidth+mX<mCanvasWidth){ 
     canvas.translate(bitMapWidth+mX, 0);  
     if(!mBitMapBuffer.isRecycled()){ 
      canvas.drawBitmap(mBitMapBuffer, 0, 0, null); 
     } 
     canvas.restore();     
    } 

あなたが最初save()を呼び出すことなくrestore()を呼んでいます。 translate()への呼び出しも必要ありません。x座標とy座標をdrawBitmap()呼び出しに渡すだけです。 APIレベル1 この呼び出しで

+0

ありがとうございます。私はそれを試みるつもりです。例外メッセージが意味することを説明してください。 – prashant

+0

私はあなたの提案を試みたが、今はクラッシュしていない。翻訳通話に関する提案も取り入れました。私はいくつかのOSのバリエーションについてテストを続けます。お返事をありがとうございます。 – prashant

+0

私は非常に似た問題に遭遇しました。私のケースでは、問題のコードは第三者ベンダーのクローズドソースです。私たちは現在、修正するベンダーを追いかけていますが、その間に他の選択肢があります。例えば:sdk 4.2.2の動作を復元する? – gerrytan

2

ます。public void復元()

追加されました)(保存する前の呼び出しのバランスをとり、最後の保存呼び出し以降に行列/クリップ状態に対するすべての変更を削除するために使用されます。 save()が呼び出された回数だけrestore()を呼び出すのはエラーです。

関連する問題