Android如何停止/终止/取消媒体上传或下载

时间:2014-01-12 10:49:58

标签: android file-upload android-asynctask download media

我在Google云端硬盘上创建了一个上传或下载文件的AsyncTask。

这是我上传文件的部分代码示例:

public class AsyncUpload extends AsyncTask<String, String, String>{

    Context c;



    public AsyncUpload(Context c) {
        super();
        this.c = c;
    }


    @Override
    protected String doInBackground(String... params) {



        try{

            // File's binary content
            java.io.File fileContent = new java.io.File(localFilePath);

            InputStreamContent mediaContent = new InputStreamContent(FileInfo.getMime(localFilePath), new BufferedInputStream(new FileInputStream(fileContent)));
            mediaContent.setLength(fileContent.length());


            // File's metadata.
            File body = new File();
            body.setTitle(fileContent.getName());
            body.setMimeType(FileInfo.getMime(localFilePath));

            if(parentId!=null){
                ParentReference parent = new ParentReference();
                parent.setId(parentId);
                body.setParents(Arrays.asList(parent)); 
            }


            Drive.Files.Insert request = drive.files().insert(body, mediaContent);
            MediaHttpUploader uploader = request.getMediaHttpUploader();
            uploader.setDirectUploadEnabled(false);
            uploader.setChunkSize(MediaHttpUploader.MINIMUM_CHUNK_SIZE); 
            uploader.setProgressListener(mediaHttpUploaderProgressListener);
            File file = request.execute();
            if (file != null) {
                Log.i(TAG,"File Uploaded");
                isAttempt=false;
                return file;
            }

        } catch (IOException e) {
            Log.e(TAG,"IOEXCEPTION Message:\n"+e.getMessage());
        }


        return null;
    }

}

此代码完美无缺,但我不知道如何在文件上传(或使用类似代码下载)时停止它!

请帮助我!

非常感谢

2 个答案:

答案 0 :(得分:2)

试试这个: 第一个调用AsyncTask实例的取消方法

    findViewById(R.id.cancelButton).setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            mTask.cancel(true);
        }
    });

然后,您需要添加检查是否已取消异步任务:

    @Override
    protected String doInBackground(String... params) {

        try{
            // File's binary content
            java.io.File fileContent = new java.io.File(localFilePath);
            final FileInputStream fileStream = new FileInputStream(fileContent);
            InputStreamContent mediaContent = new InputStreamContent(FileInfo.getMime(localFilePath), new BufferedInputStream(fileStream));

            ....

            uploader.setProgressListener(new MediaHttpUploaderProgressListener() {
                void progressChanged(MediaHttpUploader uploader) {
                    if(isCancelled()) {
                        // could not find another way to cancel transferring except that:
                        fileStream.close();
                    }
                    else {
                        mediaHttpUploaderProgressListener(uploader);
                    }
                }
            });

            ....

        } catch (IOException e) {
            Log.e(TAG,"IOEXCEPTION Message:\n"+e.getMessage());
        }

        return null;
    }

希望这会奏效。

必须添加以下内容 - 这不是一种“正确”的方式来实现转移操作。 请记住,您的活动可能会被停止甚至销毁,而不是在您的任务正常工作时再次创建。 事情可能发生更糟糕的事情运行AsyncTask无法阻止在系统内存不足时销毁整个应用程序,如果您的应用程序在前台没有任何活动,则传输仍在继续。在这种情况下,转移甚至可能没有完成。

考虑将转移操作移至专用服务组件可能更好。

答案 1 :(得分:0)

如果您取消AsyncTask,则下载和上传会自动取消

if(mTask!=null) mTask.cancel();

由于