Akshay Shinde
Akshay Shinde

Reputation: 947

asynchttpclient OnSuccess method gives response after activity is finished

I am facing some difficulty in my code. I am initializing my drawer from json response, but my 'OnSuccess' method gives response when my activity gets over. also if I initialized arraylist in OnSuccess It still gives empty in OnCreate method because OnSuccess method gives response when activity is finished.

Please can anybody help me.

Here is a sample code.

    @Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    // Indicate that this fragment would like to influence the set of actions in the action bar.
    setHasOptionsMenu(true);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    mDrawerListView = (ListView) inflater.inflate(
            R.layout.fragment_navigation_drawer, container, false);
    mDrawerListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            selectItem(position);
        }
    });
    AsyncHttpClient client=new AsyncHttpClient();
    client.addHeader("X-Oc-Merchant-Id", "123");
    client.addHeader("X-Oc-Merchant-Language", "en");
    client.get("http://webshop.opencart-api.com/api/rest/categories", new AsyncHttpResponseHandler() {
        public static final String TAG = "";

        @Override
        public void onSuccess(String response) {
            // Log.i(TAG,"resp= "+response);
            try {
                JSONObject resp = new JSONObject(response);
                if (resp.getString("success").equals("true")) {
                    JSONArray array = resp.getJSONArray("data");
                    cat_count = array.length();
                    for (int i = 0; i < array.length(); i++) {
                        JSONObject ArrObj = array.getJSONObject(i);
                        category.add(ArrObj.getString("name"));
                        category_id.add(ArrObj.getString("category_id"));
                    }

                }
            } catch (JSONException e) {
                e.printStackTrace();
            }

            mDrawerListView.setAdapter(new ArrayAdapter<String>(
                    getActionBar().getThemedContext(),
                    android.R.layout.simple_list_item_activated_1,
                    android.R.id.text1,

                    new String[]{
                            //getString(R.string.title_section1),
                            //getString(R.string.title_section2),
                            //getString(R.string.title_section3),
                            category.get(0),
                            category.get(1).replaceAll("&amp;","&"),
                            category.get(2),
                            category.get(3),
                            category.get(4),
                            category.get(5).replaceAll("&amp;","&"),
                            category.get(6),
                            category.get(7),
                    }));
            mDrawerListView.setItemChecked(mCurrentSelectedPosition, true);
        }
    });


    return mDrawerListView;
}

Upvotes: 0

Views: 4286

Answers (1)

Faruk Yazici
Faruk Yazici

Reputation: 2404

It is always a good practice to use any network requests inside AsyncTask, even an AsyncHttpClient. So, you should get your JSON data in the onSuccess of the AsyncHttpClient, which will be placed inside the doInBackground of the AsyncTask. Then in the onPostExecute of the AsyncTask, you can set your views, which will also be inside a runOnUi thread.

Here are the brief codes. I have stated where to fetch JSON data and where to set the views:

    AsyncTask myTask = new AsyncTask() {

        @Override
        protected Object doInBackground(Object... params) {

            client.get("http://webshop.opencart-api.com/api/rest/categories", new AsyncHttpResponseHandler() {
                public static final String TAG = "";

                @Override
                public void onSuccess(int arg0, Header[] arg1, byte[] arg2) {
                    // HERE FETCH YOUR JSON DATA

                }

                @Override
                public void onFailure(int arg0, Header[] arg1, byte[] arg2, Throwable arg3) {

                }

            });
            return null;
        }

        @Override
        protected void onPostExecute(Object result) {
            super.onPostExecute(result);

            runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    // HERE SET YOUR VIEWS

                }
            });
        }

    };

    myTask.execute();

Upvotes: 1

Related Questions