null بودن دادههام در ارسال به اینترنت!! (حل شده)
سلام دوستان
داخل یکی از اکتیویتیهام دادههام رو داخل onResume از اینترنت میخونم، و داخل متغیری ذخیره اش می کنم:
G.selectedBrand.phone = object.getString("phone");
بعد از اون داخل onCreate یه درخواست دیگه به اینترنت میدم که دادههایی که قبلا از اینترنت گرفته ام رو میفرستم به url سرور:
G.url + "?action=read&phone=" + G.selectedBrand.phone;
مشکلی که دارم این هست که G.selectedBrand.phone که در url درخواست دومم به اینترنت می فزستم نال هست و پر نمیشه، برای رفع مشکلش داخل handler درخواست دومم به اینترنت رو می فرستم، با این کار مشکلم داخل جنیموشن حل میشه و داده هام رو به درستی دریافت می کنم ولی داخل گوشی واقعی دادههام رو نمیخونم! بنظرتون راه حلش چیه؟
اینم کد کامل:
@Override
protected void onResume() { super.onResume(); if (adapter != null) { adapter.notifyDataSetChanged(); } fromNetReadDetail();//درخواست اول ارسال به اینترنت }
@Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_detail);
new Handler().postDelayed(new Runnable() { @Override public void run() { fromNetReadBuyer();//درخواست دوم ارسال به اینترنت
adapter.notifyDataSetChanged(); } }, 500); adapter = new AdapterHyper(G.advs); grdListDetail = (GridView) findViewById(R.id.grdListDetail); grdListDetail.setAdapter(adapter);
}
ویرایش شد
این کد منه تا الآن:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);
mTask1 = new MyAsyncTask1();
mTask1.execute();
}
private MyAsyncTask1 mTask1;
private MyAsyncTask2 mTask2;
public class MyAsyncTask1 extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... value) {
fromNetReadDetail();//دستور اول ارسال به اینترنت
return null;
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(Void result) {
mTask2 = new MyAsyncTask2();// اینجا دیگه بایستی اطلاعات گرفته شده باشند و بعد از اون این ها اجرا شوند
mTask2.execute();
super.onPostExecute(result);
}
}
public class MyAsyncTask2 extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... value) {
fromNetReadBuyerProducts();// دستور دوم ارسال به اینترنت
return null;
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(Void result) {
if (adapter != null) {
adapter.notifyDataSetChanged();
}
adapter = new AdapterHyper(G.advs);
grdListDetail = (GridView) findViewById(R.id.grdListDetail);
grdListDetail.setAdapter(adapter);
super.onPostExecute(result);
}
}
private void fromNetReadBuyerProducts() {//تابع دستور دوم اتصال به اینترنت
String url = G.url + "?action=read&phone=" + G.selectedBrand.phone;
Log.i("LOG", "urlDetailBuyerProducts = " + url);
StringRequest request = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
if (response != null) {
G.advs.clear();
try {
JSONArray brs = new JSONArray(response);
Log.i("LOG", "products : "brs);
for (int i = 0; i < brs.length(); i++) {
JSONObject object = brs.getJSONObject(i);
StructHyper brand = new StructHyper();
brand.id = object.getLong("adv_id");
brand.name = object.getString("adv_name");
brand.priceReal = object.getInt("adv_price");
brand.img1 = object.getString("adv_img1");
G.advs.add(brand);
}
}
catch (JSONException e) {
e.printStackTrace();
}
adapter.notifyDataSetChanged();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError ex) {}
}) {
@Override
public void deliverError(VolleyError error) {
Toast.makeText(G.context, R.string.connect_fail, Toast.LENGTH_SHORT).show();
super.deliverError(error);
}
@Override
public Request<?> setCacheEntry(Entry entry) {
return super.setCacheEntry(entry);
}
};
RequestQueue queue = Volley.newRequestQueue(G.context);
queue.add(request);
}
متاسفانه همچنان بدون اینکه اطلاعات از اینترنت خوانده بشن دستور دوم ارسال میشه که null ارسال میشن!!
کاش زودتر گفته بودید از volley استفاده میکنید.
volley خودش همه کار رو در یک thread جدا انجام میده و نیازی به thread یا asynctask نداره، فقط کافیه متد onResponse رو override کنید، onResponse دقیقا مثل onPostExecute عمل میکنه.
شما باید تابع fromNetReadBuyerProducts رو در onResponseـه تابع fromNetReadDetail صدا کنید. از thread و asynctask هم استفاده نکنید.
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .