问题
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("&","&"),
category.get(2),
category.get(3),
category.get(4),
category.get(5).replaceAll("&","&"),
category.get(6),
category.get(7),
}));
mDrawerListView.setItemChecked(mCurrentSelectedPosition, true);
}
});
return mDrawerListView;
}
回答1:
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();
来源:https://stackoverflow.com/questions/29301157/asynchttpclient-onsuccess-method-gives-response-after-activity-is-finished