2013-12-09 27 views
5

これはデバイスの問題であるかコードで問題があるのか​​わかりませんが、相対レイアウトとイメージビューを使って簡単なドラッグ可能なソート可能なリストを作成しました。私はこのようにするための非常に具体的な理由があり、それは私の質問ではありません。Android/kindleドラッグ時折フリーズフリー

私が抱えている問題は、アプリが完全にフリーズすることがあります。アイテムがドラッグ状態になってしまいます。私が指を持ち上げると、影(ドラッグ)オブジェクトはまだ画面に残っています。画面にタッチすると、その場所に移動します。これは約1分間続き、アプリを殺すか待つかのオプションで応答しないというエラーが表示されます。その後

12-09 14:23:13.157: W/WindowManager(16415): Drag is in progress but there is no drag window handle. 

アプリがタイムアウト私はこのエラーメッセージをGoogleで検索し、唯一の情報は無いとの誰かだった

12-09 14:59:09.782: E/ActivityManager(16415): ANR in com.appname.appname (com.appname.appname/.MainActivity) 
12-09 14:59:09.782: E/ActivityManager(16415): Reason: keyDispatchingTimedOut 

エラーとしてこれを取得するときに次のようにlogcatでのみ有用ビットですリスナを引きずり、他の人がデバイスタッチセンサーがそれを維持していないと言っています。

理想的には、このエラーを修正して、最初にこのエラーが発生しないようにしたいと考えています。私がすぐにドラッグするとほとんどの場合起こるようですが、ユーザーにすぐにドラッグしないように頼むことはできません...そうですか?

また、ドラッグがアプリをフリーズさせてドラッグを中断していることを検出できる方法がありますか。タッチリスナーにタイマーを設定するのと同様に、2〜2回の割り込みのようなドラッグ位置のメッセージがない場合はドラッグしますか?私は方法を知っているタイマーのものですが、凍っている間にドラッグを強制的に停止させる方法はわかりません。何か案は?ここで

はコードです:

セットアップタッチで

//happens once when the app loads 
RelativeLayout trackList = (RelativeLayout) findViewById(R.id.nsTrackList1);  
trackList.setOnDragListener(new MyTrackDragListener(this)); 

//happens in a loop for each "track" (image view) 
trackButton = new ImageView(this); 
trackButton.setImageDrawable(nsPackages[trackId].banner[bannerSizeSelector]); 
trackButton.setOnTouchListener(new MyTrackTouchListener()); 

ドラッグオン

public class MyTrackTouchListener implements OnTouchListener { 
    boolean isDragging=false; 
    float prevX, prevY; 
    public boolean onTouch(View view, MotionEvent motionEvent) { 
     if(motionEvent.getPointerCount() < 2 && !isDragging) return false; 
     if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { 
      isDragging=false; 
      prevX=0; 
      prevY=0; 
      return true; 
     } else if (motionEvent.getAction() == MotionEvent.ACTION_MOVE) { 
      if(isDragging) return true; 
      boolean wasFirst = (prevX == 0 || prevY == 0); 
      float theTotalDiff = Math.abs(prevX - motionEvent.getX()) + Math.abs(prevY - motionEvent.getY()); 
      prevX=motionEvent.getX(); 
      prevY=motionEvent.getY(); 
      if(wasFirst) return true; 
      if(theTotalDiff <3) return true; 
      ClipData data = ClipData.newPlainText("", ""); 
      DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view); 

      view.startDrag(data, shadowBuilder, view, 0); 
      int thisViewId = view.getId(); 
      //hide view 
      view.setVisibility(View.GONE); 

      isDragging=true;  
      return true; 
     } else if (motionEvent.getAction() == MotionEvent.ACTION_UP || motionEvent.getAction() == MotionEvent.ACTION_CANCEL) { 
      isDragging=false; 
      return true; 
     }else { 

      Integer thisAction = motionEvent.getAction(); 
      Log.d("looper","Motion action: "+thisAction.toString()); 
      return false; 
     } 
    } 
} 

完全
  • は常にonDrag
  • からtrueを返す私はすでにドラッグリスナーを削除

    • を試してみました

      いくつかのことは、常に抗力の偽/基本的にリターンのすべての組み合わせが真onDrag

    • からfalseを返しますand touch
    • 2本の指とAction_Move部分を削除して、代わりにAction_downでドラッグを開始する

    同じ結果です。ドラッグ&ドロップは完全に時間の約70%で動作し、突然上述のフリーズ動作を行います。時にはそれは最初の抗力に時にはそれはいくつかの後に時々です。私は、、おそらくのドラッグスピードを除いて一貫したパターンに気づいた。私は素早くドラッグしているが、ドラッグする方向やドラッグする場所は問題にならないと思われる。

  • +0

    以前のアマゾンの従業員とKindleの開発者として、小さなテストアプリで一貫して再解析し、バグレポートを提出することができます。 –

    +0

    @CarlAndersonありがとう、私は数日の手作業によるテストを試みてきましたが、私はパターンを見ることができません。あなたはこの種の動作のためのテストアプリケーションを構築するためのアドバイスをお持ちですか?タッチ/ドラッグ・ドロップ入力をシミュレートする方法はありますか? – Lenny

    +0

    私が知っていることは何もありません。残念なことに、あなたが一貫してそれを得ることができないなら、おそらくそれを見ないでしょう。 –

    答えて

    2

    YAY!私はそれを考え出した。これは将来誰かを助けるための答えです。

    私は最終的に上部のみリスト項目(私がいることを逃したのか分からない)し、それがこの回線に絞られた壊れなくなるまで行をコメントアウト始めにそれを絞り込む:

    view.setVisibility(View.GONE); 
    

    私のリストがどのように設定されたかは、相対レイアウト(下の項目を除く)でレイアウトプロパティBELOWを使用した各アイテムです。ビューから一番上のアイテムを削除すると、二番目から一番上のアイテムは、可視性がGONEだったアイテムの下にあったので、何をすべきか分からなかった。解決策は、ビュー内の次の項目のパラメータを設定することでした。幸運にも、私は手動でトラックボタンのビューIDを設定します(ラベルなどのスクロールする他のビューもあります)ので、シーケンシャルです。だから、私の修正はid + 1のアイテムを見つけて、このように0に設定することでトップアイテムにすることでした...

    // the top item in my list is ALWAYS view id 1 
    if(thisViewId == 1){ 
        ImageView nextTrackButton = (ImageView) trackList.findViewById(thisViewId+1); 
        LayoutParams ntLP = (LayoutParams) nextTrackButton.getLayoutParams(); 
        ntLP.addRule(RelativeLayout.BELOW,0); 
        nextTrackButton.setLayoutParams(ntLP); 
    }   
    
    //hide view 
    view.setVisibility(View.GONE); 
    
    関連する問題