Метод asynchttpclient OnSuccess дает ответ после завершения действия

Я столкнулся с некоторыми трудностями в моем коде. Я инициализирую свой ящик из ответа json, но мой метод «OnSuccess» дает ответ, когда моя активность заканчивается. также, если я инициализировал arraylist в OnSuccess, он все равно дает пустой метод OnCreate, потому что метод OnSuccess дает ответ, когда действие завершено.

Пожалуйста, кто-нибудь может мне помочь.

Вот пример кода.

    @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;
}

person Akshay Shinde    schedule 27.03.2015    source источник
comment
Сетевые вызовы занимают некоторое время, чтобы получить данные с сервера. Заблокируйте пользователя, показывая индикатор выполнения, пока вы не получите данные из сетевого вызова, или, если вы не хотите блокировать пользователя, просто покажите представление индикатора выполнения с меню загрузки текста. Если пользователь вернется из этого действия, просто отмените асинхронную задачу.   -  person jitain sharma    schedule 27.03.2015


Ответы (1)


Всегда полезно использовать любые сетевые запросы внутри AsyncTask, даже AsyncHttpClient. Таким образом, вы должны получить свои данные JSON в onSuccess из AsyncHttpClient, которые будут помещены в doInBackground из AsyncTask. Затем в onPostExecute из AsyncTask вы можете установить свои представления, которые также будут внутри потока runOnUi.

Вот краткие коды. Я указал, где получить данные JSON и где установить представления:

    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();
person Faruk Yazici    schedule 27.03.2015
comment
«org.apache.http.Header» устарел. Есть ли у вас какие-либо предложения о том, что следует использовать вместо заголовка [] в OnSuccess? - person Srikar Reddy; 16.09.2015
comment
Вместо этого используйте import cz.msebera.android.httpclient.Header;. - person sagunms; 13.11.2015
comment
работает ли asynchttpclient внутри AsyncTask? - person Exigente05; 02.10.2016