我正在使用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[]
结果为空。但这确实是次要的,这里的重点是file
不断消耗带宽,而且与未来的下载重叠,减慢了速度。
有没有办法真的停止ParseFile加载?你看到任何解决方法,比如停止它的线程吗?也许使用底层螺栓框架的东西?使用我自己的异步任务?
示例:continueWhile()
方法可能有用,但我无法弄清楚如何使用它。
我想知道downvote的原因,也许是共同的头衔?这就是我遇到的问题:ParseFile.cancel()无法正常工作。根据官方docs,它应该是。{/ p>
评论建议我应该致电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.
答案 0 :(得分:9)
<强> TL; DR; 强>
我现在可以得出的唯一结论是,我们的实现存在差异,导致取消失败。
编辑:在您自己的答案中可以看到这种情况。区别在于SDK版本。 https://stackoverflow.com/a/32034500/2680506
完整答案:
cancel()
方法的说明:
&#34;取消当前网络请求和回调是否从服务器上传或提取数据。&#34;
我很好奇,所以我对自己做了一点测试。我拿了我的应用程序,从图像的字节中取出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的事实一致。
修改强>
我刚上传了一张图片,并为自己测试了取消,在我的活动的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();
}});
当注释取消时,它将输入带有填充字节数组的GetDataCallback。如果未注释取消,则不会发生回叫。奇怪的是,ProgressCallback从未被调用,尽管它表示它是有保证的。但是,看来取消对我来说仍然有效。