2012-02-16 13 views
12

Fragments ve LoaderManager kullanıyorum. Bilinmeyen sayıda görev başlatmalıyım ve paralel olarak çalıştırılabilirler (aksi halde sadece bir yükleyiciyi yeniden kullanacağım). Örneğin, bir liste görünümüm var ve her satırın o satırın içeriğini bir web sunucusuna kaydetmek için bir düğmesi olabilir. Kullanıcı, paralel olarak birden çok öğe için bir kaydetme talebi başlatabilir. Zaten API tarafından bir şey uygulanabileceği gibiLoaderManager ile çoklu Yükleyiciler için desen?

private int nextId = 0; 

private void onClickListener() { 
    Bundle bundle = new Bundle(); 
    bundle.putNextData(...); 
    getLoaderManager().initLoader(nextId++, bundle, this); 
} 

Kendimi defter tutma deneyin, bunu manuel yükleyiciler oluşan bir havuz oluşturmak ve mümkün olduğunda bunları yeniden olabilir, görünüyor?

Teşekkür

+1

Güzel soru. Çözmeyi başardın mı? Bence bir şekilde görevlerini sıraya koymalısın. –

cevap

4

Sana uzak sunucuya verilerin kaydedilmesi için Loader kullanmalıdır sanmıyorum. Bunun yerine, bir "Kaydetme" işleminin kuyruğunu işlemek için benzer bir IntentService veya benzeri bir şey kullanın. Bu şekilde, web sunucusuyla iletişiminiz kesilebilir, daraltılmış olabilir (yani, tek bir öğe için tek bir öğe için birden fazla sıraya alınmış kaydetme işlemi tek bir dosyaya aktarılabilir) ve gerekiyorsa etkinliğinizin ömrünün ötesinde yaşayacaktır.

A bir IntentService (veya eşdeğeri) tarafından işlenen kuyruğu Eğer AlarmManager kullanılarak üstel geri çekilme ile gecikmeli yeniden deneme uygulayabilirsiniz beri, back-off ile başarısız işlemleri yeniden denemek için harika bir yoldur de kaydedin.

+0

Peki ya veritabanımda 'n' kategorileri varsa ve bunları 'CursorLoader' kullanarak yüklemek istiyorum. Hangi kimliği kullanmalıyım? – pixel

+1

Kesinlikle kategoriler statik ise, keyfi kimlikler ve muhtemelen sadece tamsayılar 1..n kullanabilirsiniz. Önce bir kategori listesi yüklüyorsanız ve ardından her bir kategoride ayrıntılara sahipseniz, muhtemelen sorgunuzu optimize etmeniz gerekir. Ancak başka seçeneğiniz olmadığını varsayarak, kararlı kimlikleri, Yükleyici kimlikleri olarak kullanmalısınız, ör. imleç pozisyonları. –

1

Bir IntentService veya bağlı hizmet, her zaman bunun için iyi yaklaşımlardır. Roman noktaları olarak, çeşitli istekleri kabul etmenin ve bunları ayrı ayrı aramanızın önemle tavsiye edilmediğini unutmayın (veriyi kullanırken çok fazla iş vermeniz çok muhtemeldir - diğer şeyler arasında pilinizi boşaltırsınız. must-read bu konuda)

Şahsi olarak, istek sıralı ve kullanılabilir bir iş parçacığı havuzu olan bir sınır hizmeti kullanmanızı öneririz (bu yaklaşım, sizin durumunuzda olduğu gibi daha karmaşık ağ işlemleri için tam denetim sağlar). Yaklaşma here ve here üzerinden bir test örneği çalışma örneği hakkında daha fazla ayrıntı vardır.

Gelişmeniz hakkında bizi güncelleyin.

0

Doğru yöndesiniz, size biraz yardımcı olalım. (Aslında Veya Java;)

tekrar kullanımı gerçekten iyi bir fikir olduğunu ve Android senin için yaptı çünkü bu konuda endişelenmenize gerek yok istediğiniz gibi gibi birçok görevleri başlatabilir, bu ThreadPoolExecuter denilen

ve o sadece önceden tanımlanmış sayıda iş parçacığı açacaktır (En iyi uygulama, paralel ağ bağlantısı aygıtta çalıştırılabildiği kadar çok iş parçacığı açmaya çalışıyor. Araştırmamın 4 - 9 arasında olduğu).

Aynı URL'yi iki kez indirmeye çalışıyorsanız, kendiniz koruyabilir ve bunun için yalnızca bir görevi açabilirsiniz.

İlgili konular