2011-12-06 8 views
3

でArrayListの私は、次の基本的な構造でAndroidアプリケーションを書いて編集します。はonTouchEvent

MyThread.java - 、surfaceHolderが含まれていMyView.java

MyView.javaupdate()render()関数を呼び出す - 、render()機能を使用してキャンバスに描くMyPuzzleクラスを更新し、タッチイベントを処理します。

MyPuzzle.java - 要素のArrayList/Vectorを含んでいます。 MyPuzzleクラス内に保持されたArrayList/Vectorの内容によってrender()機能Iループでは、MyViewクラスで

、キャンバスにそれらを描く:


私の質問です。しかし、私は時折indexOutOfBoundsエラー(おそらく10回おきに)なっていた、同じMyViewクラスでi=0; i<arraylist.size()...

からループにもかかわらず、onTouchEvent機能では、私が追加するコードを持っている/描かれているArrayList/Vectorから項目を削除。 render()機能がArrayList/Vectorをループして、画面に要素を描いているよう

私のインデックスは、おそらくonTouchEvent Sによるエラーが同時に処理されている範囲外はありますか?

onTouchEventがすぐに処理されず、ArrayListキューに追加され、render()が呼び出される前に処理されたシステムを実装しようとしました。これは、問題を解決したように見えます。これは正しいと思いますか?それは私を幾分怒らせてしまった。

ご迷惑をおかけして申し訳ありませんが、ご迷惑をおかけして申し訳ありません。

+0

は、我々はあなたがエラーを取得しているコードを持つことができます例えば反復を含むリストのすべてのアクションにsynchronizeにする必要がありますか?それは私たちが皆を助けるのを助けるのに役立ちます。 – Jon

答えて

2

IndexOutOfBoundsは、反復スレッドがサイズNのリストを最初に参照し、0からNまで反復を開始する状況の直接の結果である可能性があります。スレッド2有効にするリストに入ってそれを削除しますしたがって、Thread-1がlist.get(N)で読み取ろうとすると例外が発生します。

リストの深さはあまり大きくないですし、CopyOnWriteArrayListでリストの実装を削除し、全体の失われたスワップを追加していない場合。そうしないと、

public void render(){ 
    synchronized(list){ 
    for(int i =0; i <list.size();i++){ 
     //.... 
    } 
    } 
} 
public void update(Object element){ 
synchronized(list){ 
    list.remove(element); 
} 
} 
+0

この回答をありがとう、それは間違いなく私には意味がある。私のArrayListのは、せいぜい、私はそれぞれの更新に1つのまたは2つの要素を削除/交換する傾向がある。それは、一般的に約30の比較的単純なオブジェクトを持っている、特に大きくはないので、私はCopyOnWriteArrayListとを使用して、ここで大丈夫だろうと仮定しますか?もう一度乾杯。 – woodstock365

+0

問題ありません! CopyOnWriteArrayListはうまくいくはずです! –

関連する問題