gpt4 book ai didi

android - ParseFile.cancel() 不工作 - 文件一直在下载

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:40:00 25 4
gpt4 key购买 nike

我正在使用 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 不断消耗带宽,而且与 future 的下载重叠,从而减慢速度。

有什么方法可以真正停止加载 ParseFile 吗?您是否看到任何解决方法,例如停止其线程?也许使用底层 bolt 框架的东西?使用我自己的异步任务?

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


我想知道否决票的原因,也许是共同的标题?这正是我遇到的情况:ParseFile.cancel() 不工作。根据官方docs,它应该.

评论建议我应该简单地调用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 的事实是一致的。

编辑

我刚刚上传了一张图片并为​​自己测试了取消,在我的 Activity 的 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。当 cancel 没有注释时,不会发生回调。奇怪的是,ProgressCallback 从未被调用,尽管它说它是有保证的。但是,似乎取消对我有用。

关于android - ParseFile.cancel() 不工作 - 文件一直在下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31909036/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com