2014-11-21 66 views
0

只是我下在后台线程:解析 - 上传数据有时需要永远也写不完

for (int i = 0; i < 15; i++) /* yes, my table is that small */ 
{ 
    ParseObject po = new ParseObject(table); 
    // writing some data to the object 
    // checking some defined interfaces and write data to the ParseObject... 
    // here's some example code... 
    if (dao instanceof IDaoNameable) 
    { 
     changed |= setAndCheck(po, colNameGerman, ((IDaoNameable) dao).getNameGerman()); 
     changed |= setAndCheck(po, colNameEnglish, ((IDaoNameable) dao).getNameEnglish()); 
    } 
    // ... 
    po.save(); 
} 

private static boolean setAndCheck(final ParseObject po, String field, Object data) 
{ 
    Object old = po.get(field); 
    if (old != null && old.equals(data)) 
     return false; 
    else 
     po.put(field, data); 
    return true; 
} 

表还不存在。它会自动创建。

我观察到,今天和昨天一切都有效,但是像现在一样在晚上尝试它并不起作用。我在谈论,通常上传需要几秒钟,而现在它不会在15分钟内完成。 save永远不会返回...我不知道为什么...我不知道为什么... ...

我创建了一个解析应用程序,只是用它为我自己,测试了一些大小为<的数据表100个条目...展望分析显示,我远低于我的请求限制。是否有其他限制? 也许表格创作的限制?

顺便说一句,下载表格数据始终工作......虽然这似乎是有点慢,当上传不工作,但可能只有我的感觉......

回答

0

“po.save( )“在一个循环中不可能没有性能。

你想以某种方式获得许多线程工作的API调用解析API不会互相阻塞。您当前的代码可能位于单个线程上,因为连续的“保存”调用会被阻止,等待以前的调用完成。

查看关于'bolt'的文档(查看那里的循环),并尝试让你的android SDK代码执行并行任务,包装解析“saveInBackgroud()”,应该能够分派多个并发保存任务。

如果你真的需要大集,在循环中调用保存好的表现,你可能会考虑一个完整的REST API,如:

多线程client其中每个连接到“parse.com”来自池的大小配置

OR

使用一个lib像'retrofit'

+0

其实,我试过保存在背景中,昨天也有同样的问题...我现在使用保存,因为我想我的数据被保存在一个特殊的顺序......这似乎不可能在后台保存。 .. – prom85 2014-11-21 06:07:57

+0

而对于我的用例,我只是想按需上传数据并等待它...实际上没有太多的数据...所以我真的很想知道问题出在哪里......我知道,我的方法不是最高性能的方法,但它应该起作用,至少不是,有时候,但总是... – prom85 2014-11-21 06:14:49

0

我同意罗伯特·朗特里是保存()在一个循环是一个不好的做法。你可以做的就是创建一个ArrayList<ParseObject>,并在循环往里面放

List<ParseObject> objectsToSave = new ArrayList<ParseObject>(); 
for (int i = 0; i < 15; i++) /* yes, my table is that small */ 
{ 
    ParseObject po = new ParseObject(table); 
    // writing some data to the object 
    // checking some defined interfaces and write data to the ParseObject... 
    // here's some example code... 
    if (dao instanceof IDaoNameable) 
    { 
     changed |= setAndCheck(po, colNameGerman, ((IDaoNameable) dao).getNameGerman()); 
     changed |= setAndCheck(po, colNameEnglish, ((IDaoNameable) dao).getNameEnglish()); 
    } 
    // ... 
    objectsToSave.add(po); 

} 
ParseObject.saveAllInBackground(objectsToSave, saveCallback); 

检查docs此方法的更多的变种。

+0

正如我对他的答案的评论所说的,这导致了相同的结果......我不是在寻找更快的解决方案,但一个工作的...或者为了这个季节,为什么我的方法不工作...它不是很慢,它总是不起作用... – prom85 2014-11-21 07:01:22

+0

顺便说一句,我想上传我的数据一个接一个地按顺序...速度与我目前的使用案例无关 – prom85 2014-11-21 07:03:13

+0

好的。上面的代码应该可以做到。作为一个额外的好处(即使你不需要它)它更高效 – 2014-11-21 09:31:47