2015-03-27 1 views
0

Я столкнулся с некоторыми трудностями в своем коде. Я инициализирую свой ящик от ответа json, но мой метод «OnSuccess» дает ответ, когда моя активность заканчивается. также, если я инициализировал arraylist в OnSuccess. Он по-прежнему пуст в методе OnCreate, потому что метод OnSuccess дает ответ, когда активность завершена.asynchttpclient 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; 
} 
+1

Сетевые вызовы требуют нескольких раз, чтобы получить данные с сервера. Заблокируйте пользователя, показывая индикатор прогресса, пока вы не получите данные из сетевого вызова, или если вы не хотите блокировать пользователя, просто покажите представление progressbar с меню загрузки текста. Если пользователь вернется из этого действия, просто отмените асинтезу. –

ответ

1

Это всегда хорошая практика, чтобы использовать любые сетевые запросы внутри AsyncTask, даже AsyncHttpClient. Таким образом, вы должны получить данные JSON в onSuccessAsyncHttpClient, который будет размещен внутри doInBackgroundAsyncTask. Затем в поле onPostExecuteAsyncTask вы можете установить свои виды, которые также будут находиться в потоке 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(); 
+0

'org.apache.http.Header' устарел. Есть ли у вас предложение о том, что кто-то должен использовать вместо заголовка [] в OnSuccess? –

+0

Используйте 'import cz.msebera.android.httpclient.Header;' вместо этого. – sagunms

+0

делает asynchttpclient run внутри AsyncTask? – Exigente05

Смежные вопросы