I have the following class:
public class getURLData extends AsyncTask<String, Integer, String>{
@Override
protected String doInBackground(String... params) {
String line;
try {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(params[0]);
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
line = EntityUtils.toString(httpEntity);
} catch (UnsupportedEncodingException e) {
line = "<results status=\"error\"><msg>Can't connect to server</msg></results>";
} catch (MalformedURLException e) {
line = "<results status=\"error\"><msg>Can't connect to server</msg></results>";
} catch (IOException e) {
line = "<results status=\"error\"><msg>Can't connect to server</msg></results>";
}
return line;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
}
}
And I am trying to call it like this:
String output = null;
output = new getURLData().execute("http://www.domain.com/call.php?locationSearched=" + locationSearched);
But the output variable isn’t getting data, instead I am getting an error:
Type mismatch: cannot convert from AsyncTask<String,Integer,String> to String
The method
executereturns theAynscTaskitself, you need to callget:This will start a new thread (via
execute) while blocking the current thread (viaget) until the work from the new thread has been finished and the result has been returned.If you do this, you just turned your async task into a sync one.
However, the problem with using
getis that because it blocks, it needs to be called on a worker thread. However,AsyncTask.execute()needs to be called on the main thread. So although this code could work, you may get some undesired results. I also suspect thatget()is under-tested by Google, and it is possible that they introduced a bug somewhere along the line.Reference: AsyncTask.get