2011-07-15 10 views
1

私は4つのタブA、B、C、Dを持つアプリケーションを開発しました。各タブにはアクティビティが含まれています。 4番目のタブDではアクティビティグループを追加しました.3つのアクティビティX、Y、Zを追加しています。アクティビティグループを追加した4番目のタブでは、StackOverflowエラーが発生しています。StackOverflowエラーを修正しました

これは私のスタックトレースです: -

07-15 15:22:45.587: ERROR/AndroidRuntime(222): Uncaught handler: thread main exiting due to uncaught exception 
07-15 15:22:45.677: ERROR/AndroidRuntime(222): java.lang.StackOverflowError 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.drawChild(ViewGroup.java:1529) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.drawChild(ViewGroup.java:1529) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.drawChild(ViewGroup.java:1529) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.drawChild(ViewGroup.java:1529) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.drawChild(ViewGroup.java:1529) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.widget.AbsListView.dispatchDraw(AbsListView.java:1324) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.widget.ListView.dispatchDraw(ListView.java:2972) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.View.draw(View.java:6641) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.widget.AbsListView.draw(AbsListView.java:2171) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.drawChild(ViewGroup.java:1531) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.drawChild(ViewGroup.java:1529) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.View.draw(View.java:6538) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.widget.FrameLayout.draw(FrameLayout.java:352) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.drawChild(ViewGroup.java:1531) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.drawChild(ViewGroup.java:1529) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.View.draw(View.java:6538) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.widget.FrameLayout.draw(FrameLayout.java:352) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.drawChild(ViewGroup.java:1531) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.drawChild(ViewGroup.java:1529) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.View.draw(View.java:6538) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.widget.FrameLayout.draw(FrameLayout.java:352) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.drawChild(ViewGroup.java:1531) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.drawChild(ViewGroup.java:1529) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.View.draw(View.java:6538) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.widget.FrameLayout.draw(FrameLayout.java:352) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.drawChild(ViewGroup.java:1531) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.drawChild(ViewGroup.java:1529) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.View.draw(View.java:6538) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.widget.FrameLayout.draw(FrameLayout.java:352) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.drawChild(ViewGroup.java:1531) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.drawChild(ViewGroup.java:1529) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.View.draw(View.java:6538) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.widget.FrameLayout.draw(FrameLayout.java:352) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.drawChild(ViewGroup.java:1531) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.drawChild(ViewGroup.java:1529) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.drawChild(ViewGroup.java:1529) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.drawChild(ViewGroup.java:1529) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.drawChild(ViewGroup.java:1529) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.View.draw(View.java:6538) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.widget.FrameLayout.draw(FrameLayout.java:352) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.drawChild(ViewGroup.java:1531) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.drawChild(ViewGroup.java:1529) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.view.View.draw(View.java:6538) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at android.widget.FrameLayout.draw(FrameLayout.java:352) 
07-15 15:22:45.677: ERROR/AndroidRuntime(222):  at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow 

...私はアンドロイドに非常に新しいです私を助けてください。

+0

コードを投稿してください。このスタックトレースは単なる読み込み不能です –

+1

エラーの原因となっているコードを見ることなく、間違っていることを知ることは本当に難しいですが、どこかでメモリを消費する再帰で終わるようです。 –

+0

stacktraceの代わりにコードを投稿してください – Randroid

答えて

1

どこか無限ループがあるとします。

おそらく、階層のどこかでビューの同じインスタンスを2回追加したことがあります。

修正します。レイアウトを修正してください。私はそのような複雑なレイアウトを持つ理由を見ることができません。

+0

こんにちはPedro loureiro !!私はあなたが私のエラーを非常に重大に感じると思います。私はビューの同じインスタンスを使用している場所をトレースする方法を教えてください。そして、もう1つ私は、FLAG CONSTANTSをインテントと一緒に使用して、新しいビューでタブのcontentViewを置き換えるかどうか尋ねたがっています。 ?+ –

+0

あなたがその瞬間にそれを作成していない限り、コードでビューを追加することはありません。それを2回追加しないでください! (findViewByIdを実行して、返されたビューをどこかに追加しないでください)。私は他の質問に答えることはできません。 –

+0

ビューを2回追加することはできません。ビューが既にアタッチされているという例外がすぐにスローされます。だから、スタックオーバーフローの理由にはなりません。 – 3c71

4

私はほとんどの場合、別のレイアウト方法があることに同意しますが、ネストされたビューをたくさん扱う必要がある場合には、もっと厄介な回避策があります。あなたのビューのサブクラスでは、

現在のコールスタックが失敗した場合にそれを停止し、現在のビューの描画をまもなく遅らせます。それは単にinvalidate()(postDelayedを使用する必要はありません)を呼び出すだけで動作するようですが、ハンドラを使用して遅延を作成する方が好きです。

さらに良いレイアウトを作ることが最も良い解決策であると私はまだ他の人に同意しています。この回避策は、レイアウトを行う方法が他にない場合にのみ使用してください。

編集:この回避策は実際には機能していないようです。問題を解決する唯一の方法は、ビューの階層構造を減らすことです。

+4

これは私が見た最初の本物のアイデアです.OnOSのデザインの欠如によって課せられたばかげた制限に対処しています。OSが非常に弱いためレイアウトを再構築するように人々に指示するのは正当な答えではありません – talkol

+0

私は、 StackOverflowErrorで失敗したsuper.draw(canvas)を呼び出すと、何らかの形で、ハンドラではなくメイン階層からdraw()を呼び出すようになり、無限ループが発生するため、この解決策に問題があります。あまりにも無限ループ: \tます。public voidドロー(キャンバスキャンバス) \t {\t \t \t \tは試す \t \t { \t \t \t super.draw(canvas); \t \t} \t \tキャッチ(にStackOverflowError E) \t \t { \t \t} \t \t \t} – talkol

+0

、これは、ネストされたビューの最大深さを増加させるが、それだけで、内側のビューの一部を描画しないであろうしかし、私は階層ビューを介してビューを見ると、通常はすべてのビューを見ることができます –

0

私はGoogle全体で検索しましたが、解決策を見つけることができませんでした。それから、私はちょうどこのアイデアを思いついた、それは私の古い三星ギャラクシーネクサスとボーダフォンVF695で完璧に動作します!ここで

は私の非常に深いレイアウトのルートでframeLayoutの私のハックです:

public class StackFrameLayout extends FrameLayout { 
    private boolean stackOverflow; 

    @Override 
    public void draw(final Canvas canvas) { 
     if (stackOverflow) { 
      stackDraw(canvas); 
     } else { 
      try { 
       super.draw(canvas); 
      } catch (StackOverflowError e) { 
       stackOverflow = true; 
       stackDraw(canvas); 
      } 
     } 
    } 

    public void stackDraw(final Canvas canvas) { 
     Thread thread = new Thread(getContext().getMainLooper().getThread().getThreadGroup(), new Runnable() { 
      @Override 
      public void run() { 
       StackFrameLayout.super.draw(canvas); 
      } 
     }, "draw-thread", 2000000); 
     thread.start(); 
     try { 
      thread.join(); 
     } catch (InterruptedException e1) { 
      e1.printStackTrace(); 
     } 
    } 
} 

だから、基本的に私は大きなスタックサイズのスレッドに複雑な描画メソッドを通過しました。だから、呼び出されたメソッドのスタックは、その点の増加を止めるでしょう。次に、UIスレッドは、描画スレッドが作業を終了するのを待ち、UIスレッド上で実行するように連続して描画を継続します。

関連する問題