آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

null بودن داده‌هام در ارسال به اینترنت!! (حل شده)

SaeiD-as  10 سال پیش  10 سال پیش
0 0

سلام دوستان

داخل یکی از اکتیویتی‌هام داده‌هام رو داخل 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);
}

 

0 0
ورژن جنی موشن و گوشیتون چند هست؟ (10 سال پیش)
0 0
جنی موشن 4.4.2 و گوشی 4.2 (10 سال پیش)
+1 0
به خاطر اینکه در اندروید اول onCreate اجرا میشه و بعد onResume شما میتونید جای این کارها رو عوض کنید. ولی در نهایت این کار استاندارد نیست، شما بهتره از asynctask استفاده کنید و هروقت مطمئن شدید داده‌ها خونده شده درخواست بعدی رو بدهید. (10 سال پیش)
0 0
بسیار ممنونم از پاسختون، میتونید یه مثال از AsyncTask بزنید؟ همین کدم رو با AsyncTask کامل کنید، سپاسگذارم (10 سال پیش)
+1 0
پاسخ Suragch رو از این لینک مطالعه کنید (10 سال پیش)
0 0
سپاس از پاسخ تون، این لینک رو قبلا سرچ میزدم دیده بودم، داخل متدهای onPreExecute و doInBackground و onProgressUpdate و onPostExecute چی بنویسم? دستور اول ارتباط با سرور رو توی کدومش بنویسم و چه موقع متوجه بشم که اطلاعات رو دریافت کرده و زمانی که اطلاعات رو دریافت کرد دستور دوم رو توی کدومش بنویسم?دستور اول رو توی متد onPreExecute نوشتم و دستور دوم رو داخل هر کدومش مینویسم نمیشه!! و null برمیگردونه!! (10 سال پیش)
+1 0
دستورهایی که میخواین پردازش اصلی صورت بگیره (خوندن اطلاعات از اینترنت) رو داخل doInBackground بنویسید و وقتی اطلاعات دریافت شه onPostExecute اجرا میشه و کدهای مربوطه برای استفاده از این اطلاعات رو اونجا بنویسید. اگر دو تا دستورتون هر دو از اینترنت اطلاعات میگیره باید داخل onPostExecute دستور اول یک Asynctask دیگر صدا کنید که دستور دوم رو در doInBackground اون انجام دهید (10 سال پیش)
0 0
:( باز هم نشد، چندین Log داخل برنامه گرفتم، داخل onpreExecute دستور دوم رو میفرستم، مشکلی که هست این متد اجرا میشه بعد دستورات اولم خونده میشه و اطلاعات در doInBacground گرفته میشه که دیگه فایده ای نداره و دستور دوم مجدد null فرستاده شده!! (10 سال پیش)
0 0
مهندسین و دوستان سایت کمک کنید :/ (10 سال پیش)
 برای این سوال 2 پاسخ وجود دارد.
پاسخ به سوال 
SaeiD-as  10 سال پیش
0 0

ویرایش شد


 

این کد منه تا الآن:

 @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 ارسال میشن!!

پاسخ به سوال 
Rabbit  10 سال پیش
+2 0

کاش زودتر گفته بودید از volley استفاده میکنید.

volley خودش همه کار رو در یک thread جدا انجام میده و نیازی به thread یا asynctask نداره، فقط کافیه متد onResponse رو override کنید، onResponse دقیقا مثل onPostExecute عمل میکنه.

شما باید تابع fromNetReadBuyerProducts  رو در onResponseـه تابع fromNetReadDetail صدا کنید. از thread و asynctask هم استفاده نکنید.

+1 0
سپاس گذارم Robbit عزیز، توی برنامه نویسی همین اتفاقاته که جالبه و شیرینش می کنه... به راحتی میشد با یه نگاه به برنامه گفت که زمانی که اطلاعات رو از دستور اول گرفتی همون جا دستور دوم رو بفرست، اما فکر به مسایل پیچیده این مشکل ساده رو از ذهن من دور کرد، سپاس از لطفت و وقتی که گذاشتی، مشکل حل شد :))) (10 سال پیش)

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .