2

これは、私が Asynctask を使用したダウンロード クラスです。ファイルが完全にダウンロードされると、「ファイルがダウンロードされました」と表示され、「OK」を押すと前のアクティビティに戻ります。 「読み込み中」ダイアログだけでなく、「非同期タスクをキャンセル」すること) 戻るボタンを押して、前のアクティビティに戻ります.どうすればいいですか?誰か助けてください.

public class Download extends Activity {

public static final int DIALOG_DOWNLOAD_PROGRESS = 0;

private ProgressDialog mProgressDialog;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.down);

    startDownload();


}

private void startDownload() {
    String url = data.proj;


    new DownloadFileAsync().execute(url);
}
private void showMsg() {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage("Document is downloaded")
           .setCancelable(false)
           .setPositiveButton("OK", new DialogInterface.OnClickListener() {
               @Override
            public void onClick(DialogInterface dialog, int id) {
                    //do things
                   Download.this.finish();
               }
           });
    AlertDialog alert = builder.create();
    alert.show();
}
@Override
protected Dialog onCreateDialog(int id) {
    switch (id) {
    case DIALOG_DOWNLOAD_PROGRESS:
        mProgressDialog = new ProgressDialog(this);
        mProgressDialog.setMessage("Downloading file..");
        mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        mProgressDialog.setCancelable(false);

        mProgressDialog.show();


        return mProgressDialog;
    default:
        return null;
    }
}

    class DownloadFileAsync extends AsyncTask<String, String, String> {

@Override
protected void onPreExecute() {
    super.onPreExecute();
    showDialog(DIALOG_DOWNLOAD_PROGRESS);

}

@Override
protected String doInBackground(String... aurl) {
    int count;

try {

URL url = new URL(aurl[0]);
URLConnection conexion = url.openConnection();
conexion.connect();

int lenghtOfFile = conexion.getContentLength();
Log.d("ANDRO_ASYNC", "Lenght of file: " + lenghtOfFile);

String fname;
 fname = data.proj.substring( data.proj.lastIndexOf('/')+1, data.proj.length() );

InputStream input = new BufferedInputStream(url.openStream());
String path=Environment.getExternalStorageDirectory()
        .toString() + File.separator;
OutputStream output = new FileOutputStream(path+fname);


byte data[] = new byte[1024];

long total = 0;

    while ((count = input.read(data)) != -1) {
        total += count;
        publishProgress(""+(int)((total*100)/lenghtOfFile));
        output.write(data, 0, count);
    }

    output.flush();
    output.close();
    input.close();
} catch (Exception e) {}

return null;

}
@Override
protected void onProgressUpdate(String... progress) {
     Log.d("ANDRO_ASYNC",progress[0]);
     mProgressDialog.setProgress(Integer.parseInt(progress[0]));
}

@Override
protected void onPostExecute(String unused) {
    dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
    showMsg();
}
}}
4

2 に答える 2

3

本当に古い質問ですが、多くの人がまだ AsyncTask をキャンセルする際に問題に直面しているようです。それで、ここに行きます...

タスクをキャンセルするために使用されているビュー (ここでは ProgressDialog) を格納するには、AsyncTask クラス (DownloadFileAsync) にフィールドが必要です。

ProgressDialog の場合、ダイアログを作成するときにtruesetCancelable()

mProgressDialog.setCancelable(true);

ビューを渡すには、Task への呼び出しを次のように変更します。

new DownloadFileAsync(mProgressDialog).execute(url);

AsyncTask クラス内で、この値をフィールドに保存するコンストラクターを作成し、 AsyncTask のOnCancelListener呼び出しcancelメソッドを登録します。

ProgressDialog mProgressDialog;

DownloadFileAsync(ProgressDialog progressDialog) {
    mProgressDialog = progressDialog;
    mprogressDialog.setOnCancelListener(new OnCancelListener() {
        @Override
        public void onCancel(DialogInterface dialog) {
            cancel(true);
        }
    });
}

while ループの で、 loopdoInBackgroundに次のコードを追加します。

if (isCancelled()) {
    outputStream.flush();
    outputStream.close();
    inputStream.close();
    return null;
}

このようにして、タスクがキャンセルされたかどうかをときどき確認し、キャンセルされた場合は、開いているストリームを閉じて、リターンでタスクの実行を停止します (リターンは、タスクの結果に指定されたタイプになります)。次に、onCancelled

@Override
protected void onCancelled (Integer fileSize) {
    super.onCancelled(fileSize);
    Log.d("TASK TAG", "Cancelled.");
    //anything else you want to do after the task was cancelled, maybe delete the incomplete download.
}
于 2014-05-27T11:07:40.783 に答える
0

これが私がした方法です

public class downloadAllFeeds extends AsyncTask<Void, Void, Void> 
implements OnCancelListener{


    protected void onPreExecute() {
    pDialog2.setCancelable(true);
    pDialog2.setOnCancelListener(this);
    }

    @Override
    public void onCancel(DialogInterface dialog) {
    // TODO Auto-generated method stub
    downloadAllFeeds.this.cancel(true);
    Log.d("on click cancel true","true");
    }

    @Override
    protected Void doInBackground(Void... params) {
    if(isCancelled()==true){
    //cancel true stop async
    Log.d("cancel true","true");

    }else{
      //perform your task
     }
}

これは私にとってはうまくいきました。これは非常に古い質問であることは知っていますが、答えがなかったので、今実装できることを共有する必要があると思いました:)

于 2013-10-01T18:17:52.017 に答える