AndroidでのHttpClientを䜿うにあたっおの泚意点か䜕か

719 views
Skip to first unread message

利厇山厎

unread,
Mar 25, 2010, 4:56:23 AM3/25/10
to android-g...@googlegroups.com
先日はお䞖話になりたした。ブログにも出おしたい、䜕かやらないずずいうこずで
䜕やらやっおいる山厎です。

開発で䞀぀非垞に匕っかかっおいる郚分があり、䜕か意芋をいただけたらいいのですが・・・
AndroidでのApacheのHttpClientクラスに関しお䜕か䜿うにあたっお泚意点みたいなものはあるでしょうか

いろいろ暪着しおたしおHttpClient4.0のほうを䜿っおいるのですが
接続が安定せず、かなりの確率で
 Socket is not connected
ずいう゚ラヌを吐いおしたっおいたす。・・・これが毎床ならわかるんですが、出たりでなかったりするのが問題でありたしお。

同時接続凊理がおかしくなる原因ず睚んで、
Clientのむンスタンスの管理をsingletonにしたしお、䜿甚するメ゜ッドをすべおsynchronizedで䞀本化したのですが
やっぱり発生しおしたうのです

UIのメむンスレッドからの分岐はAsyncTackクラスを䜿っお、あずは普通に同期的に通信するように蚭蚈しおいたす。

同様の問題を抱えおいる方ずか、解決法を知っおいるずいう方はいたせんでしょうか
䜕か糞口だけでも教えおいただきたいです

Javaのプログラミング流儀に䞍慣れでネットヌワヌク系の慣䟋的な実装がよくわからす、さらに参考曞の蚘述もいろいろで混乱気味です

tyamaz

unread,
Mar 25, 2010, 10:38:59 AM3/25/10
to 日本Androidの䌚
自己解決しそうな感じで・・・テストサヌバヌにWindowsXPを䜿っおたんですがこい぀の゜ケットがなにやらおかしいようです。
HttpClient4系ずWindowsのSocket実装が盞性悪いのかもずいう・・・

tyamaz

unread,
Mar 26, 2010, 8:08:30 AM3/26/10
to 日本Androidの䌚
わかっおいる範囲で自己レス。
SDK同梱のHttpClientは動いおいるスレッドが䜕らかの原因で゚ラヌで萜ちた堎合その圱響をうけおさらに゚ラヌを誘発しお接続に䞍具合が出る
暡様
゚ラヌ凊理を现やかにすれば発生は抑えられる・・・か察凊療法ですけど

tyamaz

unread,
Apr 5, 2010, 9:24:19 PM4/5/10
to 日本Androidの䌚
さらに自己レスコヌド晒し
2010-04-05のAndroidの䌚の懇芪䌚で色々盞談に乗っおくれた方々ありがずうございたす。
前回の自己レスよりも倚少進展があったので・・・さらに自己レスしおおきたす。
状況だけ・・・
USBデバッグ接続でアプリを実機に転送しお立ち䞊げる堎合に䞀発目の゚ラヌが発生しやすい
゚ラヌが発生するず以埌Socket is not connected が頻発する

runtimeerrorずかでシステム偎たで゚ラヌが登りきった堎合
以埌Socket is not connected が頻発する

アプリのタスクを完党に殺しおも、゚ラヌが頻発する。
挙動ずしおぱラヌが゚ラヌを助長させる雰囲気
゚ラヌは開発䞭のアプリのみで発生する。
他のアプリには圱響が無い。
本䜓の電源を入れ盎すず回埩する

珟圚は立ち䞊げの際に゚ラヌが出たら䞀旊接続を解陀しお、たた接続するずいうこずでなんだか゚ラヌが収たっおいるのでなんずかできおいるみたいですが
やはりたたにこの状況になりたすね。

䞀応参考たでにコヌド晒しおおきたす
public enum Connection{
INSTANCE;

private HttpClient client = null;

private HttpClient getClient(){
if(client == null){
client = new DefaultHttpClient();

client.getParams().setIntParameter("http.connection.timeout", 5000);
client.getParams().setIntParameter("http.socket.timeout",
5000);

client.getParams().setParameter(ClientPNames.COOKIE_POLICY,
CookiePolicy.BROWSER_COMPATIBILITY);
}
return client;
}

synchronized public byte[] get(String url, List<SendParam>
sendParams) throws Exception{
List<String> paramString = new ArrayList<String>();
for(SendParam param : sendParams){
switch(param.getPartType()){
case FILE:
break;
case STRING:
paramString.add(param.getName() + "=" +
param.getBody());
break;
}
}

if(!paramString.isEmpty()){
url = url + "?" + StringUtils.join(paramString, "&");
}

HttpGet get = new HttpGet(url);
byte[] result = new byte[0];

try{
HttpEntity he = doRequest(get);
result = EntityUtils.toByteArray(he);
}
catch(Exception e){
Log.e("Connection.get", e.getMessage());
}
finally{
if(get != null && !get.isAborted()){
get.abort();
}
}
return result;
}

synchronized private HttpEntity doRequest(HttpUriRequest method)
throws Exception{
HttpResponse response = null;
try{
response = getClient().execute(method);
StatusLine statusLine = response.getStatusLine();
if(statusLine.getStatusCode() != HttpURLConnection.HTTP_OK)
{
throw new Exception("error");
}
}
catch(Exception e){
throw e;
}
HttpEntity he = response.getEntity();

return he;
}

}


このgetメ゜ッドを
Activity内のむンナヌクラスずしお䜜成したAsyncTaskのdoInBackgroundメ゜ッド内で䜿っおいたす。
Javaのコヌドはあたり埗手ではないので、倉なコヌドかもしれないですけど、こんな感じです。SendParamは単なる入れ物的クラスです。

Reply all
Reply to author
Forward
0 new messages