Unblocking Android RetuarantFinder 에서는 서버에 xml 파일을 요청하여 받은 그 파일을 SAX를 이용하여 Parsing 하는 방법을 제공하고 있다.
그러나 서버에서 xml 파일을 가져오는 방법이 단순히 URL Class를 생성하여 파서에서 InputStream을 읽어 파싱하는 방식으로 하기 때문에
xr.parse(new InputSource(url.openStream()));
대안으로는HttpClient를 이용하여 해결 할 수가 있다.
관련 Site는
http://hc.apache.org/httpcomponents-client/tutorial/html/ 를 참조하면 되는 데
○ Http Request
○ Http Reponse
○ Http Entity
○ Http Content
○ Exception Handling
○ Http Parameter Setting
○ Connection Manager
○ Cookie
○ Http Authentication
으로 되어 있다.
내 생각에는 실제로 사용하려면 HttpClient를 사용해야 되지 않을까 하는 생각이 든다.
어쩌든 내 경우에는 Http Paramter를 Setting하여 Timeout을 주고자 하는 목적이기
때문에 HttpClient를 생성하고 Setting하고 실행하여 InputStream을 가져오는 로직으로 수정하여다. (아래 Flow 참조)
public ArrayList<MCTH> getReviews() {
long startTime = System.currentTimeMillis();
ArrayList<MCTH> results = null;
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp;
try {
sp = spf.newSAXParser();
XMLReader xr = sp.getXMLReader();
mcthHandler handler = new mcthHandler();
xr.setContentHandler(handler);
//xr.parse(new InputSource(url.openStream()));
xr.parse(new InputSource(getInputStreamFromURI()));
// after parsed, get record
results = handler.getReviews();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
long duration = System.currentTimeMillis() - startTime;
Log.v(TAG," call and parse duration - " + duration);
return results;
}
HttpClient를 이용하여 서버로 부터 XML 파일의 InputStream을 가져오는 부분
InputStream result = null;
URI uri = null;
try {
uri = URIUtils.createURI(URI_SCHEME, URI_HOST, URI_PORT, URI_PATH, URIQuery, null);
// Http parameter setting
HttpParams hp = new BasicHttpParams();
// Http Timeout
HttpConnectionParams.setConnectionTimeout(hp,10000);
// Create an instance of HttpClient.
HttpClient hc = new DefaultHttpClient(hp);
// Socket Timeout
HttpConnectionParams.setSoTimeout(hp,10000);
// Create a method instance.
HttpGet hm = new HttpGet(uri);
Log.v(TAG,"URI ==> " + hm.getURI());
// Create an instance HttpResponse
HttpResponse hr = null;
//Execute the request
hr = hc.execute(hm);
// Examine the response status
Log.i(TAG,"hc ===> " + hr.getStatusLine().toString());
// Get hold of the response entity
HttpEntity he = hr.getEntity();
if (he != null)
{
result = he.getContent();
}
} catch (URISyntaxException e1) {
// TODO Auto-generated catch block
Log.v(TAG,"getInputStreamFromURI URISyntaxException");
e1.printStackTrace();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
Log.v(TAG,"getInputStreamFromURI ClientProtocolException");
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
Log.v(TAG,"getInputStreamFromURI IOException" + e.getMessage());
e.printStackTrace();
}
return result;
}
출처 : http://blog.naver.com/kippee/130068924726