11

公式 API を使用して Google ドライブにアップロードするアプリを作成しましたが、これは完全に機能します。ただし、アップロードをキャンセルする方法が見つかりません。私は ASyncTask で実行しています。これまでのところ、ドライブ オブジェクト、ファイル パス、トークン、およびその他のいくつかの変数をなしにしようとしました。また、トークンを無効にしようとしましたが、これはキャッシュからトークンを削除するだけで、サーバー側で実際に無効にするわけではないようです。ASyncTask でキャンセルを呼び出しましたが、アップロードが開始された後にキャンセルされた場合、それを停止する方法はないようです。

私の問題は、ユーザーが 100 MB のファイルのアップロードを開始した場合、インターネット接続をオンまたはオフにする以外にそれをキャンセルする方法がないことです。これは実用的ではありません。これは私のアップロードコードです:

  java.io.File jFile = new java.io.File(path); //Does not get file just info
                File body = setBody(jFile, mimeType);
                try
                {
                  java.io.File mediaFile = new java.io.File(path);
                  InputStreamContent mediaContent =
                      new InputStreamContent(mimeType,
                          new BufferedInputStream(new FileInputStream(mediaFile)));
                  mediaContent.setLength(mediaFile.length());
                  request = drive.files().insert(body, mediaContent);
                  request.getMediaHttpUploader().setProgressListener(new CustomProgressListener());
                  File file = request.execute();

確かにアップロードをキャンセルする方法はありますか?

4

4 に答える 4

8

素晴らしい質問です。メディアのアップロード リクエストをキャンセルする機能のリクエストを提出しました。

https://code.google.com/p/google-api-java-client/issues/detail?id=671

ただし、これは、そのライブラリの現在の設計に基づいて実装するのが難しい機能である可能性があります。

考慮すべきもう 1 つのオプションは、AsyncTask を使用せず、代わりに自分でマルチスレッドを実装し、実行中のスレッドを中止することです。楽しいことではありませんが、今これを行うための唯一の選択肢かもしれません。

于 2012-12-03T16:08:45.103 に答える
2

コメントで、リクエストをスレッドに入れて割り込みを呼び出すことは機能しないと述べました。そこで、別の方法を探していました。

私はついに醜いものを見つけました: アップロードされたファイルの InputStream を閉じてください!

私は次のように初期化します:

mediaContent = new InputStreamContent(NOTE_MIME_TYPE,new BufferedInputStream(new FileInputStream(fileContent)));
mediaContent.setLength(fileContent.length());

そして、私が持っている停止リスナーで:

IOUtils.closeQuietly(mediaContent.getInputStream());

確かに、より良い方法でそれを行うことができるはずです!

よろしく

于 2012-12-24T11:29:20.343 に答える
0

私も長い間答えを探していました。以下は、私が思いつくことができる最高のものです。

必要な場所にFutureオブジェクトを保存します (Objectまたはを使用Void):

Future<Object> future;

このコードを呼び出します (Java 8):

try
{
    ExecutorService executor = Executors.newSingleThreadExecutor();

    future = (Future<Object>) executor.submit(() ->
    {
       // start uploading process here
    });

    future.get();            // run the thread (blocks)
    executor.shutdown();
}
catch (CancellationException | ExecutionException | InterruptedException e)
{}

キャンセルするには、次のように呼び出します。

future.cancel(true);

このソリューションは、スレッドの停止 (非推奨) とは異なり、これまでのところ厄介な副作用を引き起こしておらず、割り込みとは異なり、キャンセルを保証します。

于 2014-06-22T16:07:02.520 に答える
-1

私はそれを行う厄介な方法を見つけました。Android アプリを開発していますが、同様のロジックが他のプラットフォームにも適用できると思います

アップロード リクエストに progressListener を設定しました。

uploader.setProgressListener(new MediaHttpUploaderProgressListener() {
    @Override
    public void progressChanged(MediaHttpUploader uploader) throws IOException {
        if (cancelUpload) {
            //This was the only way I found to abort the download
            throw new GoogleDriveUploadServiceCancelException("Upload canceled");
        }
            reportProgress(uploader);
    }
});

ご覧のとおり、アップロードを中止する必要があるときに、外部から設定されるブール値のメンバーを使用しました。このブール値が true に設定されている場合、アップロードの進行状況の次の更新時にクラッシュし、リクエストが中止されます。

繰り返しますが、非常に醜いですが、それが機能させる唯一の方法でした

于 2016-03-20T15:47:45.173 に答える