ParseFile.cancel()不起作用-文件不断被下载



我正在使用parse.com Android 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();
        }
    }
});

我希望在达到50%后装载会停止,但事实并非如此。我在这种情况下的日志是:

1
2
3
....
49
50
51
....
98
99
100
true

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

是否有任何方法可以真正停止加载ParseFile?你看到什么变通方法了吗,比如停止它的线程?也许是使用底层螺栓框架的东西?使用我自己的异步任务?

示例:continueWhile()方法可能有用,但我不知道如何使用它


我想知道被否决的原因,也许是共同的标题?这正是我所经历的: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
    });
}

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

//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.

TL;DR

在这一点上,我能得出的唯一结论是,我们的实现中存在差异,这导致取消操作失败。

编辑:这似乎是你自己的答案中看到的情况。区别在于SDK版本。https://stackoverflow.com/a/32034500/2680506

完整答案:

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();

测试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();

测试1的结果与您描述的类似,因为文件很小,我只得到了一个100%的进度回调,但随后它也调用了SaveCallback

然而,在测试2中,cancel()方法的功能似乎与预期的一样,导致没有日志或回调。

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

编辑

我刚刚上传了一张图片,并为自己测试了cancel,在我活动的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();
    }});

当cancel被注释时,它将进入带有填充字节数组的GetDataCallback。如果取消未被评论,则不会发生回拨。奇怪的是,ProgressCallback从未被调用,尽管它说它是有保证的。然而,似乎取消对我来说仍然有效。

看起来这是一个真正的错误,现在已经修复。我曾经和v1.9.2一起发布;今天我更新到v1.10.0,一切都很好。

相关内容

  • 没有找到相关文章

最新更新