PDA

View Full Version : تفاوت setOnClickListener با onClick



loo30fer
دوشنبه 20 اردیبهشت 1395, 06:26 صبح
با سلام
میخواستم بدونم تفاوت این دو که در عنوان بیان کردم چیست و کدام باعث سربار اضافی میشن بنده برای نظم بیشتر در کد ترجیحم بدین شکل هست:

public class LoginActivity extends AppCompatActivity implements View.OnClickListener{

private Button button;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
Button button = (Button)findViewById(R.id.button);
button.setOnClickListener(this);
}


@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(), "Hello World", Toast.LENGTH_LONG).show();
}




}

ولی میبینیم که عمومیت این روش بیشتره :

public class LoginActivity extends AppCompatActivity {

private Button button;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {


}
});


}

}

ممنون میشم تفاوت و اینکه کدوم باعث سربار اضافی میشن رو بیان کنید با تشکر

BOB
دوشنبه 20 اردیبهشت 1395, 08:08 صبح
سلام
عمومیت مورد دوم، فقط به دلیل سادگی و عدم آشنایی برنامه نویسان با برنامه نویسی شی گراست. همچنین در صورت وجود handler متعدد، رویداد onCreate سنگین میشود که باعث تاخیر در باز شدن اکتیویتی خواهد شد.

مورد اول خیلی کاربردی تر است، چون متغیر به handler وجود داشته و به سادگی میتوان آن را به اشیاء متعدد منتصب کرد. در صورت زیاد بودن اشیاء با رویداد مشابه، با کمی تغییر در مورد اول و بررسی view فراخواننده رویداد، نتایج فوق العاده بهینه تر خواهد بود.

godofphp
دوشنبه 20 اردیبهشت 1395, 09:51 صبح
عزیز شما اگه با مفاهیم شی گرایی و کلاس آشنا باشید به راحتی مسئله رو درک خواهید کرد . هر دو مثالی که زدید از لحاظ کاربردی هیچ تفاوتی ندارند .
در کلاس اولی که از appcompatActivity ارث بری کردید از کلاس OnClickListener نیز ایمپلمنت انجام گرفته یعنی تمام متدهای این کلاس درون کلاس شما پیاده شده و نیازی به نوشتن مجدد نیست پس نوشتن فقط onClick برای ویوهای شما کفایت میکنه چون کلاس این متد ها قبلا به اکتیویتی شما شناخته شده است
اما
در کلاس دوم شما فقط از کلاس appCompatActivity فقط ارث بری کردید و هیچ متدی از کلاس OnClickListener فرااخوانی نشده در حقیقت برای فراخوانی متد onClick حتما باید از این کلاس ایملمنت میشد . حالا که نشده شما مجبور به استفاده از متد setOnClickListener هستید که هیچ تفاوتی با مورد اول نداره

loo30fer
دوشنبه 20 اردیبهشت 1395, 10:41 صبح
عزیز شما اگه با مفاهیم شی گرایی و کلاس آشنا باشید به راحتی مسئله رو درک خواهید کرد . هر دو مثالی که زدید از لحاظ کاربردی هیچ تفاوتی ندارند .
در کلاس اولی که از appcompatActivity ارث بری کردید از کلاس OnClickListener نیز ایمپلمنت انجام گرفته یعنی تمام متدهای این کلاس درون کلاس شما پیاده شده و نیازی به نوشتن مجدد نیست پس نوشتن فقط onClick برای ویوهای شما کفایت میکنه چون کلاس این متد ها قبلا به اکتیویتی شما شناخته شده است
اما
در کلاس دوم شما فقط از کلاس appCompatActivity فقط ارث بری کردید و هیچ متدی از کلاس OnClickListener فرااخوانی نشده در حقیقت برای فراخوانی متد onClick حتما باید از این کلاس ایملمنت میشد . حالا که نشده شما مجبور به استفاده از متد setOnClickListener هستید که هیچ تفاوتی با مورد اول نداره
ممنون از توجه و پاسخ هردو عزیز
بنده کاملا با مفاهیم شی گرایی اشنایی دارم هدف من از این بوده که کدام بهینه تر و باعث سربار کمتری میشن و اینکه ابزاری برای سنجشش وجود داره یا نه

BOB
دوشنبه 20 اردیبهشت 1395, 12:39 عصر
ممنون از توجه و پاسخ هردو عزیز
بنده کاملا با مفاهیم شی گرایی اشنایی دارم هدف من از این بوده که کدام بهینه تر و باعث سربار کمتری میشن و اینکه ابزاری برای سنجشش وجود داره یا نه

در حالتی که ذکر کردید و یا با ایجاد چند Event Handler ساده، تفاوتی از نظر سربار حافظه ندارند. اما در صورت نیاز به استفاده از رویداد در لیستها و یا به هرشکل در صورت نیاز به handler برای تعداد زیادی اشیاء، بدیهیست که ایجاد Handler های کمتر، منجر به مصرف کمتر حافظه میشود. درنتیجه تعریف یک Handler و انتصاب آن به اشیاء متعدد بهینه تر خواهد بود. برای تست آن هم میتوانید از ابزار Android Memory Monitor استفاده کنید.

Nevercom
سه شنبه 21 اردیبهشت 1395, 08:43 صبح
در بیشتر موارد انتخاب بین بهینگی (نسبی) و خوانایی کد هست.

در حالتی که Listener مستقیماً برای هر Object و بصورت Anonymous Inner Class تعریف و ست میشه، از دید من Flow یا روند اجرای کدها واضح تر هست، تا اینکه در متدی دیگه بر اساس id و احتمالاً در یک Switch عملیات موردنظر برای این اکشن تعریف شده باشه.

از طرفی اگر تعداد اشیاءی که این Event رو باید براشون هندل کرد زیاد باشه، میتونه کدها رو شلوغ کنه.

در حالتی که برای هر شئ یک Listener جداگانه تعریف میشه، عملاً چون آبجکت های بیشتری تولید میشه، حافظه ی بیشتری مصرف میشه، اما مدیریت کردن این سبک از بهینه‌گی از دید من کار بیهوده ای هست، Overhead ی که این مورد میاره قابل اغماض هست، مگر اینکه تعداد اشیاء خیلی خیلی زیاد باشه.

به هر عنوان من شخصاً زمانی که تعداد شون خیلی زیاد نباشه، از Anonymous inner class استفاده می کنم، چون وقتی کدهام رو بعدها نگاه میکنم، برام واضح و مشخص هست که در رویداد OnClick این شئ چه اتفاقی می افته و این خیلی برای من مهم تر هست تا Overhead احتمالی و قابل چشم پوشی که این روش میاره.