2014-11-21 70 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