PDA

View Full Version : return از Interface



pouya1999best@g
پنج شنبه 28 اسفند 1393, 16:40 عصر
چجوری result یک interface رو به متد parentش return کنم؟
private String getData(){
MyClass.listenet(new onDataReceiver{
@override
public void onData(String result){
/*how to return result to method*/
}});
return null}

Nevercom
پنج شنبه 28 اسفند 1393, 17:33 عصر
مشخصاً به این دلیل از Interface برای تبادل اطلاعات استفاده کردید که مشخص نیست چه زمانی داده ها آماده بشن (مثلاً رویداد کلیک، یا دریافت پاسخ از سرور...)
و اگر هدف این هست که داده ای که اینترفیس رو دریافت کرده رو بدید به متد getData و بعد متد getData رو به شکل زیر استفاده کنید:
String data = getData();
Toast.makeText(thsi, data, Toast.LENGTH_LONG).show();

ساختار درستی رو انتخاب نکردید، چون هیچ تضمینی وجود نداره که متد Toast در هربار اجرا داده ای رو نمایش بده یا خیر (درواقع داده ای براش موجود باشه یا خیر).

اگر مشخص کنید که هدفتون چی هست میشه بهتر راهنمایی کرد.

pouya1999best@g
پنج شنبه 28 اسفند 1393, 17:46 عصر
در String result یک رشته ای هست که از یک سرور دریافت میشه.
مشکلم همینه که شما گفتید؛نمیدونم چه زمانی داده ها دریافت میشن و اینترفیس،متغیر رو پر میکنه.
پیشنهاد شما چیه؟(برای یک WebService Module و استفاده در کلاس های بیشتر دیگر...)

Nevercom
پنج شنبه 28 اسفند 1393, 20:34 عصر
فرض می کنیم در کلاس AsyncTask کار ارتباط با سرور رو انجام میدید، در Constructor این کلاس می تونیم Interface رو دریافت کنیم و در متد onPostExecute داده هار و بهش ارسال کنیم:
private class AsyncLogin extends AsyncTask<String, Void, JSONObject> { private final onDataReceiver IListener;
private ProgressDialog pdia;


public AsyncLogin(onDataReceiver ilistener) {
IListener = ilistener;
}


@Override
protected JSONObject doInBackground(String... params) {...}


@Override
protected void onPostExecute(String result) {
pdia.dismiss();
IListener.onData(result);
super.onPostExecute(result);
}


@Override
protected void onPreExecute() {
pdia = new ProgressDialog(parent);
pdia.setMessage("Loading...");
pdia.setCancelable(false);
pdia.show();


super.onPreExecute();
}
}

نحوه ی استفاده هم چیزی شبیه به این خواهد بود:
onDataReceiver mListener = new onDataReceiver() { @override
public void onData(String result){
/*how to return result to method*/
Toast.MakeText(Activity.this, result, Toast.LENGTH_LONG).show();
}
};
new AsyncLogin(mListener).execute(phoneNumber, password);

هروقت داده ای از سرور دریافت بشه، متد onData صدا زده میشه و Toast نمایش داده میشه.

pouya1999best@g
پنج شنبه 28 اسفند 1393, 21:47 عصر
الان مثلا من چجوری return کنم؟
private String fetchWOEIDxmlString(String queryString){
CreateHttpClient httpClient = new CreateHttpClient();
httpClient.url(queryString);
httpClient.listener(new Listener(){
@Override
public void onFail(int statusCode){
/** -- Exception -- **/}
@Override
public void onDataReceive(String result){
}}).read();
return null;}
البته بگم توی کلاسCreateHttpClient از AsynceTask استفاده کردم و توی متد Read اونو execute کردم.

Nevercom
جمعه 29 اسفند 1393, 00:22 صبح
اصولاً در این الگو قرار نیست چیزی رو return کنید، باید کدهاتون رو در متدهای onFail و onDataReceive بنویسید.
Listener رو هم که به کلاس موردنظر پاس دادید، چه مشکلی وجود داره ؟

pouya1999best@g
جمعه 29 اسفند 1393, 09:11 صبح
میخوام اینجوری استفاده بشه:
String result = fetchWOEIDxmlString()
و String result رو در متد ها و کد های دیگر استفاده کنم.
در این صورت چکار کنم؟

pouya1999best@g
یک شنبه 02 فروردین 1394, 01:43 صبح
دوستان؛ممنون میشم اگه کمکم کنید.

pouya1999best@g
یک شنبه 02 فروردین 1394, 12:41 عصر
الان با کتابخانه volley هم این مشکل رو پیدا کردم:
private String getWeatherString(String woeidNumber){
String queryUrl = "barnamenevis.org";


StringRequest request = new StringRequest(Request.Method.GET,queryUrl,new Listener<String>(){
@Override
public void onResponse(String result){
//How To return result
}},new ErrorListener(){
@Override
public void onErrorResponse(VolleyError e){
e.printStackTrace();}});


return null;}
لطفا کمک کنید:گریه:

Nevercom
یک شنبه 02 فروردین 1394, 14:14 عصر
من براتون توضیح دادم، اما شما مفهوم رو درست درک نکردید.

یک زمانی برنامه ها خط به خط اجرا میشدن، یعنی تا خط اول کارش تموم نشده بود برنامه خط دوم رو اجرا نمیکرد
بعد ها متوجه شدن این الگو چندان مناسب نیست، بخصوص زمانی که ظاهر گرافیکی پاش کشیده شد وسط و دیگه قسمتی از کد زمانی باید اجرا میشد که مثلاً روی دکمه ای کلیک شده باشه.
بعد از اون برنامه ها بر اساس رویداد ها کار میکردن، قسمتی از کد تنها زمانی اجرا میشد که رویداد مورد نظرش رخ داده باشه، بقیه ی قسمت ها هم خط به خط اجرا میشدن
بعد از اون پردازنده های چندهسته ای فراگیر شدن دیدن که میشه کارها رو بین این هسته ها تقسیم کرد، اما خب برای استفاده از این قابلیت باید برنامه ی ما کارش رو انجام بده و قسمت دیگری از برنامه در پروسه ی دیگری پردازش بشه و نتیجه ی ش رو دریافت کنیم.

الان چیزی که باهاش روبرو هستید همین حالته، شما دارید قسمتی از کدتون رو میدید به یه پروسه ی دیگه تا انجام بشه و دلیلتون هم این هست که نمیخواید تا زمانی که مثلاً اون فایل دانلود نشده برنامه ی شما Freeze بشه و نتونه کاری انجام بده.
اما در عین حال توقع دارید یک متد رو اجرا کنید، پروسه متوقف بشه تا اون متد داده ها رو از سرور بگیره، مقداری رو برگردونه، مقدار بازگشتی رو بگیرید، در یک متغیر بریزید و برنامه ی شما ادامه پیدا کنه.

اصولاً این الگویی که میبینید همه جا استفاده شده، هدفش اینه که بقیه ی برنامه کار خودش رو انجام بده و وقتی اون پروسه ی پشت صحنه کارش تموم شد، نتیجه رو برگردونه به اون Listener، حالا هرکاری لازم دارید اونجا انجام بدید.

حرف من این نیست که چیزی که دنبالش هستید شدنی نیست، فقط اشاره می کنم که از زاویه ی اشتباه به موضوع نگاه می کنید.

dalmif
یک شنبه 02 فروردین 1394, 14:38 عصر
خیلی کامل توضیح داده شد.
ممنون

pouya1999best@g
یک شنبه 02 فروردین 1394, 15:07 عصر
خب این دیگه کتابخانه خود گوگل هست.من چکار کنم؟مجبورم.
کد نویسی کتابخانه گوگل قابل تغییر نیست.من هم روشی غیر از این به فکرم نمیرسه؛چکار کنم؟

pouya1999best@g
دوشنبه 03 فروردین 1394, 00:47 صبح
بچه ها تو رو خدا کمک کنید؛پروژم روی هواست...