ParseFile.cancel()无法正常工作 - 文件不断下载

nat*_*rio 12 android parse-platform

我正在使用parse.comAndroid SDK管理我的应用中的一些图片.是cancel()停止与parse.com服务器进行交易的唯一方法吗?

最小的例子:

final ParseFile file = ... ;
file.getDataInBackground(new GetDataCallback() {

    //called when loading is done
    @Override
    public void done(byte[] bytes, ParseException e) {
        Log.e(TAG, String.valueOf(bytes == null));
    }

}, new ProgressCallback() {

    //called to notify progress   
    @Override
    public void done(Integer integer) {
        Log.e(TAG, String.valueOf(integer));
        if (integer > 50) {
            file.cancel();
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

我希望在达到50%之后加载停止,但事实并非如此.我在这种情况下的登录将是:

1
2
3
....
49
50
51
....
98
99
100
true
Run Code Online (Sandbox Code Playgroud)

与您调用的cancel()次数和次数不同的唯一区别是,如果您取消了byte[]结果,则为null.但这确实是次要的,这里的重点是file不断消耗带宽,而且与未来的下载重叠,减慢了速度.

有没有办法真正停止ParseFile加载?你看到任何解决方法,比如停止它的线程吗?也许使用底层螺栓框架的东西?使用我自己的异步任务?

示例:continueWhile()方法可能有用,但我无法弄清楚如何使用它.


我想知道downvote的原因,也许是共同的头衔?这正是我所经历的:ParseFile.cancel()不起作用.根据官方文件,它应该.

评论建议我应该简单地打电话break.虽然我认为它不会起作用,但我可能会澄清,我发布的代码只是一个简洁,简洁的工作示例,提供了上下文和问题.我不想cancel()从进程回调内部进行事务处理; 我想parseFile.cancel()从各处打电话.我把进度回调显示出来,虽然它应该停止,但事实并非如此.


编辑这是我真正想要做的.我尝试了不同的方法,但就是这样.

ParseFile currentFile;
public void setFile(ParseFile file) {

    if (currentFile != null) {
        currentFile.cancel();
    }

    currentFile = file;
    currentFile.getDataInBackground(new GetDataCallback() {
        ...
    }, new ProgressCallback() {
        ... // logs
    });
}
Run Code Online (Sandbox Code Playgroud)

有了这样的代码,并说,要下载两个大图像,事情就像:

//calling setFile(file1)
1
2
3
...
20
21
22
//calling setFile(file2), thus also calling file1.cancel()
1
2
23 //file1 going on!
3
24
4
25
... //things get slower and this screws up progress bars and such.
Run Code Online (Sandbox Code Playgroud)

Dav*_*e S 9

TL; DR;

我现在可以得出的唯一结论是,我们的实现存在差异,导致取消失败.

编辑:这似乎是你自己的答案中所见的情况.区别在于SDK版本./sf/answers/2242415031/

完整答案:

cancel()方法的描述:

"取消当前网络请求和回调,无论是从服务器上传还是从服务器获取数据."

我很好奇,所以我做了一些自己的测试.我拿了我的应用程序,ParseFile从图像的字节中取出并尝试将其保存在后台.

测试1

    Bitmap file = BitmapFactory.decodeResource(context.getResources(), R.drawable.background);
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    file.compress(Bitmap.CompressFormat.PNG, 100, stream);
    byte[] byteArray = stream.toByteArray();
    final ParseFile myTestFile = new ParseFile(byteArray);
    myTestFile.saveInBackground(new SaveCallback(){

        @Override
        public void done(ParseException e) {
            if(e == null)
            {
                Log.i(null, "Done saving.");
            }

        }

    }, new ProgressCallback(){

        @Override
        public void done(Integer progress) {
            Log.i(null, "Progress at " + progress + "%");
            if(progress > 50)
            {
                myTestFile.cancel();
            }
        }});
    //myTestFile.cancel();
Run Code Online (Sandbox Code Playgroud)

测试2

    Bitmap file = BitmapFactory.decodeResource(context.getResources(), R.drawable.background);
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    file.compress(Bitmap.CompressFormat.PNG, 100, stream);
    byte[] byteArray = stream.toByteArray();
    ParseFile myTestFile = new ParseFile(byteArray);
    myTestFile.saveInBackground(new SaveCallback(){

        @Override
        public void done(ParseException e) {
            if(e == null)
            {
                Log.i(null, "Done saving.");
            }

        }

    }, new ProgressCallback(){

        @Override
        public void done(Integer progress) {
            Log.i(null, "Progress at " + progress + "%");
        }});
    myTestFile.cancel();
Run Code Online (Sandbox Code Playgroud)

测试1的结果与你描述的类似,因为文件很小我只有100%的进程回调但是它也调用了SaveCallback.

但是,在测试2中,该cancel()方法看起来像预期的那样起作用,导致没有日志或回调.

看来,取消无法正常工作,因为您是从回调中调用它.这与您最初在自己的测试中取消后继续看到ProgressCallbacks的事实一致.

编辑

我刚刚上传了一张图片并为​​自己测试了取消,在我的活动的onCreate()方法中我有这样的代码:

ParseQuery<ParseObject> newQuery = ParseQuery.getQuery("TestObject");
newQuery.findInBackground(new FindCallback<ParseObject>(){
    @Override
    public void done(List<ParseObject> objects, ParseException e)
    {
        ParseFile myTestFile = objects.get(0).getParseFile("file");
        myTestFile.getDataInBackground(new GetDataCallback()
        {
            @Override
            public void done(byte[] data, ParseException e)
            {
                Log.i(null, "Download finished");
            }
        }, 
        new ProgressCallback()
        {

            @Override
            public void done(Integer percentDone)
            {
                Log.i(null, "Download at " + percentDone + "%");
            }
        });
        //myTestFile.cancel();
    }});
Run Code Online (Sandbox Code Playgroud)

当注释取消时,它将输入带有填充字节数组的GetDataCallback.如果未注释取消,则不会发生回叫.奇怪的是,ProgressCallback从未被调用,尽管它表示它是有保证的.但是,看来取消对我来说仍然有效.


nat*_*rio 6

看起来这是一个真正的错误,现在已修复.我过去常常一直在v1.9.2发布; 今天我更新到了v1.10.0,一切正常.