2011-08-22 23 views
6

Android cihazından bir web sunucusuna dosya yüklemek için HttpClient kullanımını gerektiren bir Android uygulaması üzerinde çalışıyorum. Yüklediğim dosya 1 Gb'ye kadar boyutlara ulaşabilir ve bu nedenle cihaz yükleme sırasında bağlantıyı kaybederse zaman aşımları oluşabilir. Garip olan şey, soket için belirlediğim zaman aşımının herhangi bir etkisi olmadığı görünüyor. SocketTimeoutException'ı yükseltmek yerine, bağlantıyı kaybettiğimde uygulama askıda kalıyordu. Apache HttpClient 4.0 Android'de soket için zaman aşımı başarısız oldu

kullanıyorum çalıştı:

HttpConnectionParams.setConnectionTimeout(params, CrashLogParams.TIMEOUT); 
HttpConnectionParams.setSoTimeout(params, CrashLogParams.TIMEOUT); 

ama bu sadece bağlantı zaman aşımı değil, soket zaman aşımı çalıştı. Ayrıca Denedim:

HttpParams p = httpclient.getParams(); 
p.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 10000); 
p.setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 10000); 

Ben

httpclient.execute(httppost); 

uygulama bağlantısı yükleme sırasında kaybolduğunda askıda görünüyor yürüttükten sonra bağlantı zaman aşımı için istisna alacağı, çünkü bağlantı zaman aşımı çalıştığını biliyoruz nedeni ancak uygulama başarıyla sunucuya bağlantı kurduktan sonra.

Uygulamamı test etmek için, uygulamanın nasıl tepki vereceğini görmek için ağı farklı zamanlarda devre dışı bıraktım. İsteği göndermeden önce ağı devre dışı bırakırsam bir bağlantı hatası alıyorum ve uygulamamın bu şekilde ele alınabilir, ancak yükleme sırasında bunu devre dışı bırakırsam uygulama kilitleniyor. Tabii ki tüm bu istekleri AsyncTasks ile yapıyorum, bu yüzden ana UI Thread çökmez. Ben sadece soket herhangi bir veri almadığında zaman aşımına uğramak ya da burada bir şey eksik varsa emin olmak için başka bir yolu olup olmadığını merak ediyorum. Birçok blog ve yazı okudum, ancak çoğu sadece benim için çalışmayan SO_TIMEOUT kullanmayı öneriyor.

sotimeout not working in a multipart http post on android 2.1

+0

Uygulamanız daha küçük boyutlu bir dosyada çalıştı mı? – momo

+0

1 mb dosyaları denedim ve hata hala var.Sanırım daha küçük dosyalarda, dosya yüklemeleri arasında zaman ayırma olasılığınız daha yüksektir, ancak bu noktadan başka bir şey değildir. Ağ arızaları durumunda uygulamamın sağlam olmasını sağlamak istiyorum. –

+0

Bu aynı sorunu yaşıyorum, benim yükleme boyutları benim için birkaç kb sırasına göre oldukça küçük. Bu hatayı tetiklemek için gerekli gibi görünen şey, ağın çalışıp çalışmadığını kontrol ettikten sonra, ancak execute() işlevini çağırmadan önce aşağı inmesidir. – Michael

cevap

0

Kendi ClientConnectionManager oluşturuyorlar mı? AndroidHttpClient.newInstance() için source'a bir göz atın.

Yeni bir BasicHttpParams nesnesi oluşturup hem bir ThreadSafeClientConnectionManager hem de DefaultHttpClient için yapıcılara iletirler. Kurucuda ClientConnectionManager'da parametreler ayarlamanın bir yolu görmüyorum.

+1

Evet SSL'yi etkinleştiren kendi HttpClient'i oluşturmak için DefaultHttpClient'ı genişletiyorum. Genişletilmiş sınıf, createClientConnectionManager() öğesini geçersiz kılar ve HttpParams'ı belirttiğiniz şekilde ayarlar. Listelediğim kod, bağlantı zaman aşımını doğru bir şekilde ayarlayabildi, çünkü zaman aşımı süresini artırdığımda, bir istisna ortaya çıkana kadar beklemek zorunda kaldığım süre de buna bağlı olarak arttı. Tek sorun, hangi değerleri denediğime bakılmaksızın soket zaman aşımı asla yükseltilmez. –

0

Aynı kullanım durumunuzla aynı sorunla karşılaşıyorum. Bu android 2.3.6 çalışan bir samsung galaxy s2 olur ama 4.x aynı cihazla değil. Ne yazık ki bu tam olarak benim müşteri kullanır cihazı ve çeşitli Android sürümleri ve yapıcıları ile yaklaşık 10 diğer test cihazlarında iyi çalışır.

Apache'den HttpClient yerine HttpUrlConnection kitaplığı ile çalışırken saatlerce harcadım ama sonuç aynı. AndroidHttpClient aynı davranışı gösterir. Bu buldum

tek geçici çözüm şey olursa iplik durdurmak için ayrı bir konu HttpClient.execute() yöntemi koymak ve bir güvenlik olarak thread.join(timeout) aramaya oldu ... bir donanım tanımlaması ya da OS ilgili sorun var gibi görünüyor söylemek götürüyor ters gidiyor. Dezavantaj yükleme iyi çalışıyor ancak zaman aşımından daha uzun sürüyor, istek kesintiye uğruyor ...

Bu arada bir şey bulursanız, paylaşırsanız çok memnun olurum.

İlgili konular