有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在Android中使用CustomMultiPartEntity取消上传文件

我使用custommultipatentity上传带有取消功能的文件,文件上传成功,但当我尝试取消此任务以停止上传时,不会,是否有人实施或知道如何停止上传

下面是我的取消代码

import java.io.FilterOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.Charset;

import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntity;

import 安卓.util.Log;

public class CustomMultiPartEntity extends MultipartEntity {
    private static final String TAG = CustomMultiPartEntity.class.getSimpleName();
    private final ProgressListener listener;
    private static boolean isUserInterrupt = false;
    public CustomMultiPartEntity(final ProgressListener listener) {
        super();
        this.listener = listener;
        isUserInterrupt = false;
    }

    public CustomMultiPartEntity(final HttpMultipartMode mode,
            final ProgressListener listener) {
        super(mode);
        this.listener = listener;
        isUserInterrupt = false;
    }

    public CustomMultiPartEntity(HttpMultipartMode mode, final String boundary,
            final Charset charset, final ProgressListener listener) {
        super(mode, boundary, charset);
        this.listener = listener;
        isUserInterrupt = false;
    }

    public void cancelUploading(){
        isUserInterrupt = true;
        if(cos!=null){
            try{
                cos.flush();
                cos.close();
                cos = null;
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    }
    private CountingOutputStream cos;
    @Override
    public void writeTo(final OutputStream outstream) throws IOException {
        if(isUserInterrupt){
            if(cos!=null){
                try{
                    cos.flush();
                    cos.close();
                    cos = null;
                }catch(Exception e){
                    e.printStackTrace();
                }
            }
        }

        cos = new CountingOutputStream(outstream, this.listener);
        super.writeTo(cos);
        Log.i(TAG, "write to calling");
    }

    public static interface ProgressListener {
        void transferred(long num);
    }

    public static class CountingOutputStream extends FilterOutputStream {

        private final ProgressListener listener;
        private long transferred;

        public CountingOutputStream(final OutputStream out,
                final ProgressListener listener) {
            super(out);
            this.listener = listener;
            this.transferred = 0;
        }

        public void write(byte[] b, int off, int len) throws IOException {
            if(isUserInterrupt)
            {
                Log.i(TAG, "write interrupt, off="+off+", len+"+len);
                return;
            }
            out.write(b, off, len);
            this.transferred += len;
            this.listener.transferred(this.transferred);
            Log.i(TAG, "write off="+off+", len+"+len);
        }

        public void write(int b) throws IOException {
            if(isUserInterrupt)
            {
                Log.i(TAG, "write interrupt, b+"+b);
                return;
            }
            out.write(b);
            this.transferred++;
            this.listener.transferred(this.transferred);
            Log.i(TAG, "write b+"+b);
        }
    }
}

在AsyncTask中使用此方法取消上载

public class UploadImageTask extends AsyncTask<HttpResponse, Integer, String> {
@Override
    protected void onCancelled() {
        super.onCancelled();
        Log.e(TAG, "task cancelled");
    }

    public void taskCancel() {
        if(httpPost!=null){
            httpPost.abort();
            httpPost = null;
        }
        if(httpClient!=null){
            httpClient.getConnectionManager().shutdown();
        }
        httpClient = null;
    }
}

使用下面的代码取消任务

UploadImageTask task = (UploadImageTask)iMap.get(id);
if(task!=null && !task.isCancelled()){
    task.taskCancel();
    task.cancel(true);
}

共 (1) 个答案

  1. # 1 楼答案

    我找到了取消上传当前文件的方法。创建一个中止或关闭与服务器当前连接的方法

    public class MyTask extends AsyncTask<Void, Integer, String>{
    
        private HttpPost httpPost;
        private CustomMultiPartEntity multipartContent;
        private HttpClient httpClient;
        @Override
        protected String doInBackground(HttpResponse... arg0) {
            httpClient = new DefaultHttpClient();
            HttpContext httpContext = new BasicHttpContext();
            httpPost = new HttpPost(urlStr);
    
            ....
            // other upload statement here 
            return resp;
        }
        @Override
        protected void onCancelled() {
            super.onCancelled();
            Log.e(TAG, "task cancelled");
        }
    
        public void taskCancel() {
            if(httpPost!=null){
                httpPost.abort();
                httpPost = null;
            }
            if(httpClient!=null){
                httpClient.getConnectionManager().shutdown();
            }
            httpClient = null;
        }
    }
    

    现在先调用taskCancel(),然后调用cancel(true)方法中止当前的上传任务

    希望这对你有帮助