I'm a little bit to stupid - sry for that.
I wrote an API which gives some JSON back. My goal is to use this API from an Android App. I've tried it with AsyncTask but failed hard.
I imagine to use it like this:
- Calling the class, telling the URL and the type of the result. (which json, like the account information or some data)
- When the loading is finished, calling the right class of the result, with the result as argument.
Here's the link to the API: Link
What do I have to do?
EDIT:
Here's my code now. He doesn't like the GetRequest variable type, also getHttpClientInstance is not possible. He also cannot resolve the method execute on MyAsyncTask.
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.action_settings) startActivity(new Intent(this, editPreference.class));
if (item.getItemId() == R.id.action_kurse) startActivity(new Intent(this, Login.class));
if (item.getItemId() == R.id.action_refresh) {
String url = "http://vplan.florian-schmidt.org/api/get_klassen.php";
new MyAsyncTask().execute(url);
};
return super.onOptionsItemSelected(item);
}
class MyAsyncTask extends AsyncTask <GetRequest,String,JSONObject> {
@Override
protected JSONObject doInBackground(GetRequest... params)
{
JSONObject data = null;
GetRequest eventRequest = params[0];
if (eventRequest instanceof GetRequest)
{
DefaultHttpClient httpClient = HttpClient.getHttpClientInstance();
try
{
HttpGet httpGet = HttpClient.getHttpGetInstance();
httpGet.setURI(eventRequest.getUriString());
httpGet.setHeader("Content-type", "application/json");
HttpResponse httpResponse = httpClient.execute(httpGet);
//Check is authentication to the server passed
if (httpResponse.getStatusLine().getStatusCode() == 401)
{
// do some actions to clear userID, token etc ...
// finish
finish();
}
HttpEntity responseEntity = httpResponse.getEntity();
if (responseEntity instanceof HttpEntity)
data = new JSONObject(EntityUtils.toString(responseEntity));
responseEntity.consumeContent();
}
catch (ClientProtocolException CPException)
{
//set data to null, handle and log CPException
}
catch (IOException ioException)
{
//set data to null, handle and log IOException
}
catch (JSONException jsonException)
{
//set data to null, handle and log JSONException
}
catch (URISyntaxException useException)
{
//set data to null, handle and log URISyntaxException
}
}
return data;
}
@Override
protected void onPostExecute(JSONObject jsonObject) {
TextView tv = (TextView) findViewById(R.id.textView);
tv.setText(jsonObject.toString());
}
}
Don't be silly, everyone has to start from somewhere when learning :)
As Bosko mentions, an AsyncTask is probably the best solution here because you need to take any I/O type operations off the main thread, otherwise the application will crash.
I answered a similar question a while back, but the same code applies, please see the below.
The
onCreate
sets anonClickListener
onto a button, when the button is pressed a new AsyncTask is created andexecute()
is called.The
doInBackground
runs on a separate thread so you can perform long running tasks here, such as calling your REST API and handling the response. See Boskos' answer for that bit of code.The
onPostExecute
happens after the task is complete, so you can handle your JSON object here and update the UI as you need to.If you haven't already done so, I'd highly suggest reading the AsyncTask docs.
Hope this helps
In many application I used AsyncTask to communicate with API and IMO AsyncTask approach have a lot benefits.
Here is example of AsyncTask which gets the JSON data over the API:
You have to post your code and point to problem, then SO users can help you. Everything else is personally opinion based and it is not constructive.