Android Parse JSON stuck on task

I am trying to parse some JSON data. My code worked for a while, and I'm not sure what I changed to suddenly break the code. When I run my code, I do not receive any errors or warnings at runtime. I create a new AsyncTask and execute it. When I call .get() on this new task, the debugger stops on this line and takes more than 30 minutes. I could not get a debugger or runtime to complete this task.

JSON:

 protected void setUp(Context context) { _context = context; getConfig(); } // get config file protected void getConfig() { if (config != null) return; config = new Config(); String url = configURL; AsyncTask<String, Integer, JSONObject> jsonTask = new DownloadJSONTask() .execute(url); JSONObject configItem = null; try { configItem = jsonTask.get(); //debugger pauses here if (configItem == null) return; config.configVersion = configItem.getString("field_configversion"); config.currentAppVersion = configItem .getString("field_currentappversion"); config.getSupportURL = configItem.getString("field_getsupporturl"); config.getCatalogURL = configItem.getString("field_getcatalogurl"); config.getDataVersion = configItem.getString("field_dataversion"); config.getDataUrl = configItem.getString("field_dataurl"); config.getDataApiKey = configItem.getString("field_dataapikey"); } catch (InterruptedException e) { e.printStackTrace(); System.err.println("Download of config interrupted"); } catch (ExecutionException e) { e.printStackTrace(); System.err.println("Download of config failed to execute"); } catch (JSONException e) { e.printStackTrace(); } cacheStaticData(_context); } 

DownloadJSONTask.java

 package com.example.simplegraph; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.json.JSONException; import org.json.JSONObject; import android.content.Context; import android.os.AsyncTask; public class DownloadJSONTask extends AsyncTask<String, Integer, JSONObject> { private HttpClient client = new DefaultHttpClient(); private HttpGet request; private HttpResponse response; DownloadJSONTask() { super(); } // tries to grab the data for a JSONObject @Override protected JSONObject doInBackground(String... urls) { request = new HttpGet(urls[0]); try { response = client.execute(request); HttpEntity entity = response.getEntity(); if (entity != null) { InputStream instream = entity.getContent(); String result = convertStreamToString(instream); JSONObject json = new JSONObject(result); instream.close(); return json; } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); } return null; } // converts the InputStream to a string and add nl private String convertStreamToString(InputStream is) { BufferedReader br = new BufferedReader(new InputStreamReader(is)); StringBuilder sb = new StringBuilder(); String line = null; try { while ((line = br.readLine()) != null) { sb.append(line + "\n"); } } catch (IOException ioe) { ioe.printStackTrace(); } finally { try { is.close(); } catch (IOException ioe) { ioe.printStackTrace(); } } return sb.toString(); } } 

And HomeActivity.java

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_home); new AddStringTask().execute(); } class AddStringTask extends AsyncTask<Void, String, Void> { @Override protected Void doInBackground(Void... unused) { app = (EconApplication) getApplication(); getApp().setUp(HomeActivity.this); HomeActivity.this.setUpDrawer(); return (null); } @Override protected void onPostExecute(Void unused) { setUpDataDisplay(); setUpGraphRange(); createTable(); createGraph(-1); } } 

QUESTION: Why is my code stuck in .get ()?

+6
source share
2 answers

AsyncTask.get() blocks the flow of the caller. Use AsyncTask.execute() .

public final Result get ()

Added to API Level 3

Waits if necessary to complete the calculation, and then retrieves its result.

Returns the calculated result.

Drawing from

How to return boolean value from AsyncTask?

Try below

  new DownloadJSONTask(ActivityName.this).execute(url); 

In your DownloadJSONTask

At construcotr

  TheInterface listener; public DownloadJSONTask(Context context) { listener = (TheInterface) context; } 

Interface

  public interface TheInterface { public void theMethod(ArrayList<String> result); // your result type } 

In your doInbackground return the result. I assume its an ArrayList of type String. Change arraylist to suit your requirements.

In your onPostExecute

  if (listener != null) { listener.theMethod(result); // result is the ArrayList<String> // result returned in doInbackground // result of doInbackground computation is a parameter to onPostExecute } 

In your activity class implement an interface

  public class ActivityName implements DownloadJSONTask.TheInterface 

Then

  @Override public void theMethod(ArrayList<String> result) { // change the type of result according yo your requirement // use the arraylist here } 

Edit: Alternative

You can make your asintesque an inner class of your activity class. The result of evaluating doInbackground is the onPostExecute parameter. Return result doInbackground . Update ui in onPostExecute .

+1
source

You can greatly simplify everything using the droidQuery library:

 $.getJSON("http://www.example.com", null, new Function() {//this will run using an AsyncTask, get the JSON, and return either a JSONObject or JSONArray on the UI Thread. @Overrde public void invoke($ droidQuery, Object... params) { if (params[0] instanceof JSONObject) { //it often ok just to assume a JSONObject, making your first line simply: JSONObject obj = (JSONObject) params[0]; //JSONObject is returned JSONObject json = (JSONObject) params[0]; //to easily parse this Object, convert it to a map first: Map<String, ?> map = $.map(json); //then you can just make a call like this: if (map.contains("field_currentappversion")) { config.currentAppVersion = (String) map.get("field_currentappversion"); } } else { //JSONArray is returned JSONArray json = (JSONArray) params[0]; //if you got an array, you can easily convert it to an Object[] for parsing: Object[] array = $.makeArray(json); } } }); 
+1
source

Source: https://habr.com/ru/post/951328/


All Articles