2011-07-21 16 views
0

私はAsyncTaskを拡張するカスタムDownloadFilesクラスを持っています。アプリは起動し、デフォルトのURLとしてAsyncTaskをバックグラウンドで開始します。それらの各のonClickイベントは現在DownloadFilesインスタンスをキャンセルし、別のURLで新しいものを作成する必要があります - UIで、私はボタンの数を持っています。 DFTAsyncTaskをキャンセルして、ワンクリックで新しいインスタンスをインスタンス化するにはどうすればよいですか?

private OnClickListener categoryClick = new OnClickListener(){ 
     public void onClick(View view) { 
      dft.cancel(true); 
      int index = catigoriesHolder.indexOfChild(view); 
      activeCategory.setText(categories[index]); 
      dft = new DownloadFilesTask(); 
      dft.execute(rssFeedURL[index]); 
      dft.execute(url); 
     } 
    }; 

DownloadFilesオブジェクト、私はキャンセルする必要が魔女です。そして、ここで私の方法をonCancelled:

protected void onCancelled() { 
      super.onCancelled(); 
     } 

私はDFTがキャンセルされた場合、クリックイベント内で確認することも試みた後、私のカスタムのダウンロード可能なクラスの新しいインスタンスを作成します。どのようにこれを行うことができ、私はこれをしようとするとき:

それは2番目のクリックでも機能しませんか? doInBackground(...)

private OnClickListener categoryClick = new OnClickListener(){ 
     public void onClick(View view) { 
      int index = catigoriesHolder.indexOfChild(view); 
      activeCategory.setText(categories[index]); 
      if (dft.isCancelled()) { 
       dft.cancel(false); 
       dft = new DownloadFilesTask(); 
       dft.execute(rssFeedURL[index]); 
      } else { 
       dft.cancel(true); 
      } 
     } 
    }; 

しかし、この場合、起こり内側あなたはisCancelled(かどうかを確認するために私に助言した後、私はこれを試してみました

: - デフォルトのURLはうまくいきますが、ボタンをクリックしてもアクションはありません。

protected List<RSSItem> doInBackground(String... urls) { 
      parse(urls[0]); 

      if (feed == null) { return null; } 

      rssList = feed.getAllItems(); 
      Iterator<RSSItem> iterator = rssList.iterator(); 

      while(iterator.hasNext()) { 
       if (isCancelled()) return null; 
       RSSItem rss = iterator.next(); 
       publishProgress(rss); 
      } 

      return rssList; 
     } 

私は現在AsyncTaskの状態を確認した後、それが動作します:

private OnClickListener categoryClick = new OnClickListener(){ 
     public void onClick(View view) { 
      String status = dft.getStatus().name(); 
      if (status.equals("FINISHED") || dft.isCancelled()) { 
       dft = new DownloadFilesTask(); 
       int index = catigoriesHolder.indexOfChild(view); 
       activeCategory.setText(categories[index]); 
       dft.execute(rssFeedURL[index]); 
      } else { 
       dft.cancel(true); 
      } 
     } 
    }; 

しかし、まだ私の期待に適合していません。現在は、DownloadFilesクラスの新しいインスタンスを取得するには、2回クリックする必要があります。それをワンクリックに変換できますか?

+0

何も私に飛び出していません。多分もっと多くのコードが私たちの助けになるでしょう。 OnClickListenerがボタンにバインドされていますか? –

+0

私は進歩を遂げました! :) – nenito

+0

しかし、まだワンクリックで動作しません!上記のソースコードに加えられた変更を見ることができます。 – nenito

答えて

3

.cancel(true)メソッドは、タスク内のキャンセルされた内部変数のみを変更します。 doInBackground()内のisCancelled()を定期的に呼び出して、それが真であると評価するときに戻る必要があります。

また、それぞれの場合に機能しないものを指定してください。

+0

私は 'int index = catigoriesHolder.indexOfChild(view);を移動しました。 activeCategory.setText(categories [index]); '** IF **文に、私のアプリは正常に動作します!サポートありがとう! – nenito

関連する問題