29

サーバーから動画をダウンロードするアプリを作りました。問題は次のとおりです。

ダウンロードをキャンセルすると、次のように電話します。

myAsyncTask.cancel(true)

myAsyncTaskキャンセルを呼び出しても止まらないことに気づきました...ProgressDialogまだ上がっていて、ステータスからステータスにジャンプするようなもので、キャンセルしAsyncTaskてダウンロードボタンをクリックして再開するたびに、新しいAsyncTaskスタートが始まります...それぞれダウンロードをクリックします。次にキャンセルしてから、もう一度ダウンロードをAsyncTask開始します。

なぜmyAsynTask.cancle(true)私のタスクをキャンセルしないのですか?私はもう背景にそれを望んでいません。[キャンセル]をクリックすると、完全にシャットダウンしたいだけです。

どうやってするの ?

編集:

gtumca-MACと、私を助けてくれた他の人たちに感謝します。

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

ありがとう!!!

4

7 に答える 7

59

AsyncTask は次のプロセスをキャンセルしません

myAsynTask.cancel(true) 

そのためには、手動で停止する必要があります。

たとえばdoInBackground(..)、while/for ループでビデオをダウンロードしています。

protected Long doInBackground(URL... urls) {

         for (int i = 0; i < count; i++) {
          // you need to break your loop on particular condition here

             if(isCancelled())
                  break;             
         }
         return totalSize;
     }
于 2012-06-04T13:59:56.403 に答える
3

別のスレッド(AyncTask)を開始すると、終了する必要があります。AsyncTask 内のコードにキャンセル ステートメントを手動で追加する必要があります。

cancel(boolean) を呼び出すことで、いつでもタスクをキャンセルできます。このメソッドを呼び出すと、後続の isCancelled() の呼び出しで true が返されます。このメソッドを呼び出すと、onPostExecute(Object) の代わりに onCancelled(Object) が doInBackground(Object[]) が戻った後に呼び出されます。タスクができるだけ早くキャンセルされるようにするには、可能であれば (たとえばループ内で) doInBackground(Object[]) から定期的に isCancelled() の戻り値をチェックする必要があります。

ドキュメントで詳細を確認してください: http://developer.android.com/reference/android/os/AsyncTask.html

于 2012-06-04T14:01:14.677 に答える
0

優先度やバックグラウンド タスクのキャンセルなどの多くの機能を備えた vogella asyncTask ライブラリを使用することをお勧めします。そして、素晴らしいチュートリアルまたはそれを使用する方法はここにあります

于 2015-01-12T08:09:26.440 に答える
0

このコードを使用できます。次のようにOTAファイルをダウンロードしています:

static class FirmwareDownload extends AsyncTask<String, String, String> {

        public String TAG = "Super LOG";
        public String file;
        int lenghtOfFile;
        long total;

        @Override
        protected String doInBackground(String... f_url) {
            try {
                int count;
                Utilies.getInternet();

                URL url = new URL(f_url[0]);
                URLConnection connection = url.openConnection();
                connection.connect();
                lenghtOfFile = connection.getContentLength();
                mProgressBar.setMax(lenghtOfFile);
                InputStream input = new BufferedInputStream(url.openStream(), 8192);
                String fileName = f_url[0].substring(f_url[0].lastIndexOf("/"), f_url[0].length());
                File root = Environment.getExternalStorageDirectory();
                File dir = new File(root.getAbsolutePath() + fileName);

                Log.d(TAG, "trying to download in : " + dir);
                dir.getAbsolutePath();
                OutputStream output = new FileOutputStream(dir);
                byte data[] = new byte[1024];


                while ((count = input.read(data)) != -1) {

                    if (isCancelled())
                        break;

                    total += count;
                    mProgressBar.setProgress(Integer.parseInt("" + total));
                    Log.d("Downloading " + fileName + " : ", " " + (int) ((total * 100) / lenghtOfFile));
                    mPercentage.post(new Runnable() {
                        @Override
                        public void run() {
                            mPercentage.setText(total / (1024 * 1024) + " Mb / " + lenghtOfFile / (1024 * 1024) + " Mb");
                        }
                    });
                    output.write(data, 0, count);
                }

                output.flush();
                output.close();
                input.close();

                //new InstallHelper().commandLine("mkdir data/data/ota");

                File fDest = new File("/data/data/ota/" + fileName);
                copyFile(dir, fDest);
                FirmwareInstaller fw = new FirmwareInstaller();
                fw.updateFirmware();

            } catch (Exception a) {
                System.out.println("Error trying donwloading firmware " + a);
                new InstallHelper().commandLine("rm -r  data/data/ota");
                dialog.dismiss();

            }
            return null;
        }

    }

したがって、キャンセルする場合は、次のコードを使用してください。

 fDownload.cancel(true);
于 2015-09-11T14:34:43.920 に答える
0

過去 2 週間から調査してきましたが、非同期操作を手動で強制終了する方法がわかりません。一部の開発者は BREAK を使用します。for ループのチェックイン中。しかし、私のシナリオでは、バックグラウンド スレッド内でループを使用していません。しかし、私はそれがどのように愚かな論理を働かせるかを知る必要がありますが、完全にうまく機能します.

downloadFile.cancel(true);   //This code wont work in any case.

バックグラウンドスレッドでキャンセルして多くの作業を行う代わりに、プログラムでwifiをオフにします

WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
wifi.setWifiEnabled(false);

どこで操作を強制終了し、それをオンにする必要がありますか。

WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
wifi.setWifiEnabled(true);

try ブロックが IOException にジャンプして、バックグラウンド タスクを強制終了します。

于 2015-01-12T07:46:57.163 に答える