2016-05-31 1 views
1

次のようなコードがあります。ダイアログをキャンセルするたびにInterruptExceptionが発生し、cancelメソッドは実際には機能しません。下に示すように、onPostExecuteメソッドでcancelの状態を出力しますが、これは真ではなく偽です。 isRunningパラメータを追加する前に、明らかにスレッドはバックグラウンドで実行されていました。 isRunningはスレッドを停止しますが(onPostExecuteメソッドが実行されました)、例外が発生した理由と、まだメソッドの中にまだfalseが残っている理由を知りたいと思います。ありがとう!スレッドが停止しているかどうか、AsyncTaskを使用してAndroidのprogressDialogにある問題

public void startDownload(View view){ 
    dialog = new ProgressDialog(this); 
    final Downloader downloader = new Downloader(this, dialog); 
    downloader.execute(0); 
    dialog.setOnCancelListener(new DialogInterface.OnCancelListener() { 
     @Override 
     public void onCancel(DialogInterface dialog) { 
      downloader.cancel(true); 
     } 
    }); 
} 


public class Downloader extends AsyncTask<Integer, Integer, String> { 
private Context context; 
private PowerManager.WakeLock wakeLock; 
private ProgressDialog dialog; 
public boolean isRunning = true; 

public Downloader(Context context, ProgressDialog dialog) { 
    this.context = context; 
    this.dialog = dialog; 
} 

@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 
    PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 
    wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, 
      getClass().getName()); 
    wakeLock.acquire(); 

    dialog.setMessage("Downloading..."); 
    dialog.setIndeterminate(true); 
    dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
    dialog.setCancelable(false); 
    dialog.setButton(ProgressDialog.BUTTON_NEGATIVE, "Cancel", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      isRunning = false; 
     } 
    }); 
    dialog.show(); 
} 

@Override 
protected String doInBackground(Integer[] params) { 
    int count = params[0]; 
    while(count<100 && isRunning){ 
     publishProgress(count); 
     try{ 
      count++; 
      System.out.println(count); 
      Thread.sleep(200); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
    return null; 
} 

@Override 
protected void onProgressUpdate(Integer... values) { 
    super.onProgressUpdate(values); 
    dialog.setIndeterminate(false); 
    dialog.setMax(100); 
    dialog.setProgress(values[0]); 
} 

@Override 
protected void onPostExecute(String s) { 
    super.onPostExecute(s); 
    wakeLock.release(); 
    dialog.dismiss(); 
    if (s != null) 
     Toast.makeText(context,"Download error: "+ s, Toast.LENGTH_LONG).show(); 
    else 
     Toast.makeText(context,"File downloaded", Toast.LENGTH_SHORT).show(); 
    System.out.println(isCancelled()); 
} 

}

+0

'Thread.sleep(200);'を削除してやり直すことはできますか? –

答えて

0

あなたが別のAsyncTaskを実行、または並列に、このいずれかを開始し、.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)代わりの.execute()を使用していないことを確認してください。それ以外の場合、バックグラウンドで別のAsyncTaskを既に実行している場合、この他のAsyncTaskは最後のものが終了するまで実行されません。

一方

、任意のループを実行時にものをチェックしたり、破損するisCancelled()を使用し、そうするように、カスタムブールでAsyncTaskのライフサイクルステータスを追跡しないようにしようと、必要に応じて、任意の機能を実装するためにAsyncTaskのonCancelled()メソッドをオーバーライドしますその時点で必要かもしれません。

参照を確認することを忘れないでください:AsyncTask - Android Developers

関連する問題