我观看了HttpClient进度代码,但我仍有疑问无法找到答案 从哪里获取此ProgressListener以放置构造函数参数?以及如何正确使用代码?请帮忙
这是代码
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;
public class CountingMultipartEntity extends MultipartEntity {
private final ProgressListener listener;
public CountingMultipartEntity(final ProgressListener listener) {
super();
this.listener = listener;
}
public CountingMultipartEntity(final HttpMultipartMode mode, final ProgressListener listener) {
super(mode);
this.listener = listener;
}
public CountingMultipartEntity(HttpMultipartMode mode, final String boundary,
final Charset charset, final ProgressListener listener) {
super(mode, boundary, charset);
this.listener = listener;
}
@Override
public void writeTo(final OutputStream outstream) throws IOException {
super.writeTo(new CountingOutputStream(outstream, this.listener));
}
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 {
out.write(b, off, len);
this.transferred += len;
this.listener.transferred(this.transferred);
}
public void write(int b) throws IOException {
out.write(b);
this.transferred++;
this.listener.transferred(this.transferred);
}
}
}
我可以实现这样的界面吗?
...
public static interface ProgressListener {
void transferred(long num);
}
public static class Progress implements ProgressListener
{
public void transferred(long num) {
// // update the progress bar or whatever else you might want to do
}
}
...
但是,如何为包含HttpClient的外部类初始化ProgressListener呢?
CountingMultiPartEntity entity = new CountingMultiPartEntity(new ProgressListener() {
public void transferred(long num) {
// update the progress bar or whatever else you might want to do
}
});
答案 0 :(得分:2)
如果您没有任何已实现它的类,则需要自己构建ProgressListener
接口的实现。对于像听众这样的事情,通常使用匿名内部类来完成。
CountingMultipartEntity entity = new CountingMultipartEntity(new ProgressListener() {
@Override
public void transferred(long num) {
// update the progress bar or whatever else you might want to do
}
});
答案 1 :(得分:0)
您应该将ProgressListener导入到您要调用的类
import com.blahblah.YourProjectName.CustomMultipartEntity.ProgressListener;
我正在使用名为“CustomMultipartEntity”的类似类,不要忘记更改它的名称。
CustomMultipartEntity类实现是:
package com.blahblah.YourProjectName;
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;
public class CustomMultipartEntity extends MultipartEntity
{
private final ProgressListener listener;
public CustomMultipartEntity(final ProgressListener listener)
{
super();
this.listener = listener;
}
public CustomMultipartEntity(final HttpMultipartMode mode, final ProgressListener listener)
{
super(mode);
this.listener = listener;
}
public CustomMultipartEntity(HttpMultipartMode mode, final String boundary, final Charset charset, final ProgressListener listener)
{
super(mode, boundary, charset);
this.listener = listener;
}
@Override
public void writeTo(final OutputStream outstream) throws IOException
{
super.writeTo(new CountingOutputStream(outstream, this.listener));
}
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
{
out.write(b, off, len);
this.transferred += len;
this.listener.transferred(this.transferred);
}
public void write(int b) throws IOException
{
out.write(b);
this.transferred++;
this.listener.transferred(this.transferred);
}
}
}
这是一个示例电话:
CustomMultipartEntity reqEntity = new CustomMultipartEntity(new ProgressListener() {
public void transferred(long num) {
if((int) ((num / (float) totalSize) * 100) > 0)
progressHandler(num);
}
});