Problem
I had developed an application in which I hit several URLs and show data on mobile. But the problem is that it requires more time. If I check the same URL on Firebug tool I get a response in 2-3 seconds, but the same URL requires 8-15 seconds on mobile. In my Android application I am using HTTP get and post method as follows:
public InputStream httpGetResponseStream(String url, String request) {
connectionUrl = url;
InputStream response = null;
try {
processGetRequest();
HttpResponse httpresponse = httpclient.execute(host, get);
response = httpresponse.getEntity().getContent();
} catch (Exception e) {
response = null;
}
return response;
}
public InputStream httpPostResponseStream(String url, String request) {
connectionUrl = url;
InputStream response = null;
try {
processPostRequest();
if (request != null) {
InputStreamEntity streamEntity = new InputStreamEntity(
new ByteArrayInputStream(request.getBytes()), request
.length());
post.setEntity(streamEntity);
}
HttpResponse httpresponse = httpclient.execute(host, post);
response = httpresponse.getEntity().getContent();
}catch (Exception e) {
response = null;
}
return response;
}
private void processGetRequest(){
uri = Uri.parse(connectionUrl);
String protocol = connectionUrl.substring(0, 5).toLowerCase();
if (protocol.startsWith("https")) {
securedConnection = true;
} else {
securedConnection = false;
}
if (securedConnection) {
host = new HttpHost(uri.getHost(), 443, uri.getScheme());
} else {
host = new HttpHost(uri.getHost(), 80, uri.getScheme());
}
get = new HttpGet(uri.getPath()+query_string);
}
private void processPostRequest() {
uri = Uri.parse(connectionUrl);
String protocol = connectionUrl.substring(0, 5).toLowerCase();
if (protocol.startsWith("https")) {
securedConnection = true;
} else {
securedConnection = false;
}
if (securedConnection) {
host = new HttpHost(uri.getHost(), 443, uri.getScheme());
} else {
host = new HttpHost(uri.getHost(), 80, uri.getScheme());
}
post = new HttpPost(uri.getPath());
}
Any suggestion to improve code will be appreciated
Solution
I personally haven’t used anything HTTP-related in Java yet, and thus can’t talk about your performance. What I can see though is the following code:
if(protocol.startsWith("https"){
securedConnection = true;
} else {
securedConnection = false;
}
I will assume you have securedConnection
as a private classwide field, so I won’t talk about the fact that you only use it to determine the port in the method scope.
the fun thing is, your code could be written in one line:
securedConnection = protocol.startsWith("https");
if you now inline protocol (Eclipse Alt + Shift + i) you get following line:
securedConnection = connectionUrl.substring(0,5).toLowerCase().startsWith("https");
you see that the call to substring is unneccesary.
You also have a large duplication in itself with the methods processPostRequest()
and processGetRequest
. they are actually exactly the same apart from the last line:
get = new HttpGet(uri.getPath()+query_string);
post = new HttpPost(uri.getPath());
you might want to move them into a method like this:
private enum Type{
GET, POST
}
private HttpRequest processRequestOfType(Type t){
uri = Uri.parse(connectionUrl);
securedConnection = connectionUrl.toLowerCase().startsWith("https");
host = securedConnection ? new HttpHost(uri.getHost(), 443, uri.getScheme())
: new HttpHost(uri.getHost(), 80, uri.getScheme());
request = t == Type.GET ? new HttpGet(uri.getPath()+query_string)
: new HttpPost(uri.getPath());
return request;
}
Lastly I saw that in your method httpGetResponseStream()
you have the parameter request, which is never used in the code you posted.