2009-06-20 15 views
4

モバイルアプリケーションは、リモートから電子メールの添付ファイルをダウンロードするオプションをユーザーに提供します。リモートサーバーと接続し、別のスレッドでコンテンツをダウンロードします。私は擬似コードを提供しています。キャンセルコマンドがユーザーによってトリガーされたときにスレッドを停止する

new Thread(new Runnable() 
    public void run(){ 
    try{ 
    //open connection to remote server 
    //get data input stream 
    //create byte array of length attachment size 
    //show modeless dialog with the message "Downloading..." 
    for(int i=0;i<attachmentSize;i++){ 
     //set the progress indicator of the modeless dialog based upon for iteration 
     //read the byte from input stream and store it in byte array 
    } 
     //open file connection outputstream and store the downloaded content as a file in mobile file system 
     //show dialog with the message "attachment successfully downloaded" 
     } 
     catch(IOException ioe) { } 
     catch(Exception ex) { } 
    } 
).start(); 

私は進行状況インジケータを使用してダイアログにcancelコマンドを追加しています。ユーザがモバイルで「キャンセル」コマンドをクリックすると、dispose()メソッドを呼び出すことによって、モードレスダイアログを配置することができます。ストリーミングで電子メールの添付ファイルを取得するスレッドを突然止めることはできますか? この問題を解決するにはどうすればよろしいですか?

答えて

0

私はJavaのスレッドでの経験が非常に限られているので、私はこれの専門家ではないので、塩の粒で私の提案を取る。

実行中のスレッドを停止することはできません。あなたはできるだけ早くそれを終了することができます。ですから、たとえば、セカンダリスレッドで定期的にテストする共有フラグを用意することができます。メインスレッドがCancelクリックに応答してそれを設定すると、セカンダリスレッドが戻ります。

2

突然停止することはできますが、それはもっと重要な問題を引き起こします。

これを行うための標準的な方法は、Runnableをでチェックされるフラグを持つことです。

public class ClassHoldingRunnable { 

    private volatile boolean stopRequested = false; 

    public void executeAsync() { 

     Runnable r= new Runnable() { 

      public void run() { 

       while (!stopRequested) { 
        // do work 
       } 
      } 
     } 

     new Thread(r).start(); 
    } 

    public void cancel() { 
     stopRequested = true; 
    } 
} 

いくつかの注意事項:

  • それがいずれかにstopRequestedフラグのため不可欠ですvolatileまたは複数のスレッドによってアクセスされているため、別の可視性保証(​​、LockAtomic)が必要です。
  • stopRequestedをよく確認する必要があります。エンドユーザーが応答性の高いGUIを使用することが重要な場合は、
0

私の経験では、C#でよりですが、これはまだ適用されるかもしれません...

私はそれはちょうどあなたが希望よりも、それ以上の「スレッドを殺す」のいくつかの方法を見つけるために良いアイデアだとは思いませんオブジェクトを削除し、そのデストラクタをスキップするだけです。

割り込みを介して自殺するとスレッドに伝えることができます。スレッドの中断されたフラグをインジケータとして使用するか、そこにスリープ/ウェイトがある場合は、中断された例外をキャッチして、これがキャッチされると(finallyブロック内で)正常にシャットダウンすることができます。これは、多かれ少なかれ、あなたが探しているものを提供するはずです。

1

Connectionから読み取るスレッドを中断するいくつかの無料の方法があります。

  • おそらくInputStream.readへの単一の呼び出しをループすることで、リモート・データを読んでいるので、あなたは、単一の、比較的小さな、バイト[]オブジェクトを再利用することができます。各反復の前にbooleanメンバー変数をチェックすることができます。スレッドの構築後に一度だけ値を変更することになっているため、ブール値を同期させる必要はありません。

  • 接続を閉じると、次にスレッドがアクセスしようとするとIOExceptionがスローされます。適切なJavaME実装ではConnectionは作成されません。別のスレッドがConnectionのInputStreamから読み込んでいる場合でもclose()ブロック

関連する問題