Parameter vs Argument

Parameter: متغییری که در ورودی متد تعریف می‌کنیم.
Argument: متغییری که به عنوان ورودی به متد ارسال می‌کنیم.

ادامه نوشته

Java Object Oriented

نگاهی به برنامه نویسی شی گرا در جاوا

ادامه نوشته

Java Profilers

Profiler و APM ابزاری هایی برای مانیتورینگ و دیباگینگ پرفورمنس برنامه ها جاوا در زمان توسعه استفاده می‌شه.

ادامه نوشته

Variable Type

Static vs Dynamic
Strong vs Weak

ادامه نوشته

Java Test 1

تو این پست یکسری بدیهیات رو می‌گم، راجع یکسری از یکی دوتا ابزار خیلی خلاصه صحبت می‌کنم و سعی می‌کنم یه کار مسخره انجام بدم

ادامه نوشته

Types of References in Java

چهار نوع رفرنس توی جاوا داریم:

  • Strong References
  • Weak References
  • Soft References
  • Phantom References
ادامه نوشته

Java Garbage Collection

GC با آزاد کردن خودکار حافظه باعث سریعتر شدن برنامه نویسی می‌شه و از نوشتن کد‌های اضافه جلوگیری می‌کنه.

ادامه نوشته

Finalize vs Cleaner

در قدیم اینجوری بود که ما متد finalize رو توی اشیا بازنویسی می‌کردیم و وقتی GC می‌خواست اون شی رو نابود کنه این متد رو صدا می‌زد و ما اگه لاجیک خواصی داشتیم اونجا می‌نوشتیم.

اما به دلیل مشکلاتی که این کار بوجود میاورد اون توی جاوا ۱۱ به بعد deprecated شده.
یکی از بزرگترین مشکلاتی که بوجود میاد این هستش که این متد توی thread مربوط به GC اجرا می‌شه و باعث بوجود اومدن مکث در thread اصلی می‌شه.

حالا باید چیکار کنیم؟

باید توی شی پدر اون شی که داره نابود می‌شه یه Cleaner بسازیم و شی مورد نظر و به همراه یک runnalbe توی اون register کنیم.

+

Java Memory Model

JVM دقیقا مثل باقی برنامه ها یک فضا رو توی رم اشغال می‌کنه و خودش کامل اون رو مدیریت می‌کنه. ستا فضای کاملا جدا از هم داریم که JVM داده‌های زمان اجرا و کدهای کامپایل شده رو اونجا نگه‌میداره.

ادامه نوشته

The end of the Java's Architecture's Story

ما در مورد اینکه برنامه‌ها چجوری اجرا می‌شن صحبت کردیم ولی درباره اجرا کننده برنامه‌ها هیچ صحبتی نکردیم.

ادامه نوشته

Execution Engine

bytecode ها اینجا اجرا می‌شن. Execution Engine دستورات رو خط به خط اجرا می‌کنه‌.

ادامه نوشته

Runtime Data Area

JVM داخل رم یک فضا برای بارگذاری داده‌ها در اختیار داره. class loader شی باینری متناظر هر کلاس رو تولید می‌کنه و اونها رو بصورت جداگانه و با اطلاعات زیر به Runtime Data Area می‌‌ده و اون هم توی method area ذخیره می‌کنه.

ادامه نوشته

Class Loader Subsystem

به ازای هر برنامه که اجرا می‌شه یک نمونه از ماشین مجازی جاوا JVM داخل رم سیستم بارگذاری می‌شه و با استفاده از Class Loader Subsystem کلاس های مورد نظر رو وارد رم می‌کنه و بهش می‌گن dynamic class loading که کلاس‌ها رو load و link و initialize می‌کنه. البته این کار رو فقط یک بار در زمان اجرا انجام می‌ده.

ادامه نوشته

Java Thread

با شی Thread می‌تونیم یک فضای جدای پردازشی ایجاد کنیم. برای این کار باید یک کلاس را از آم مشتق کنیم و تابع run را در آن باز نویسی کنیم و با فراخوانی تابع start آن را اجرا کنیم. همچنین مقادیری که برای کنترل فرایند های درون آن نیاز است را می‌توانید از طریق تابع سازنده آن ارسال کنیم.

ادامه نوشته

Java Non Access Modifiers

تو جاوا یکسری modifire خاص دیگه هم داریم !!!

ادامه نوشته

Java Access Modifiers

تو جاوا چهارتا سطح دسترسی داریم !!!

ادامه نوشته

Build Android Application

از گذشته دور تا الان !

ادامه نوشته

Android Permissions

ما چهار نوع Permissions تو اندروید داریم:

  • Normal: ریسک خیلی کمی برای سیستم یا کاربر دارن. سیستم اونها رو به صورت خودکار به برنامه ها می‌ده و لازم نیست از کاربر اجازه بگیریم.
  • Dangerous: اینها ریسک زیادی دارن و می‌تونن به داده های خصوصی کاربر دسترسی داشته باشن یا به قسمت هایی از دستگاه ک می‌تونه تاثیر منفی روی کار دستگاه بزاره. به همین دلایل سیستم به صورت خودکار اونها رو ب برنامه ها نمی‌ده و باید برنامه اونها رو درخواست کنه.
  • Signature: این دسته از مجوز ها را سیستم فقط ب برنامه هایی می‌دهد ک امضای آنها اجازه استفاده از این مجوز ها را داشته باشد. اگر اجازه لازم را امضای برنامه داشته باشد سیستم این مجوز ها را بدون سوال از کاربر به برنامه می‌دهد.
  • SignatureOrSystem: این مجوز ها را سیستم فقط به برنامه هایی می‌دهد ک در پوشه اندروید روی سیستم هستند یا امضای آنها اجازه ای را دارد ک ایجاد کننده این مجوز داشته است. از استفاده از این گروه باید خود داری کنیم.

Android Application Not Responding: ANR

گاهی برنامه ما هنگ میکنه و اندروید ی پیام نشون میده ک میگه صبر میکنی یا برنامه رو ببندم !!!

ادامه نوشته

Android Command Line Tools

ابزارهای اندروید رو بهتر بشناسیم

ادامه نوشته

Backup on Android

قابلیت پشتیبان گیری به وسیله سیستم عامل اندروید !

ادامه نوشته

final vs finally vs finalize

final یک کلمه کلیدی هستش و قبل از کلاس، متد و یا متغییر ها قرار میگیره و مانع از توسعه، بازنویسی و تغییر اونها می‌شه.

finally: یک بلاک برای کد های مهم هستش که همراه با try/cache استفاده میشه و در هر دو صورت اجرا می‌شه.

finalize: یک متد هستش که gc قبل از اینکه یک شی رو دور بریزه اون رو صدا می‌کنه.

ART vs Dalvik

Dalvik از اندروید ۵ Lolipop جایگزین ART شد.

Dalvik به صورت Just-In-Time (JIT) کار می‌کنه، یعنی هر بار که برنامه اجرا میشه بایت‌کد ها رو اجرا میکنه به همین دلیل CPU بیشتری مصرف می‌کنه و زمان اجرای برنامه هم بیشتر هستش و باتری بیشتری هم مصرف میشه. ولی فضای کمتی نیاز دارن برنامه ها و بود دستگاه هم سریعتر انجام میشه.

ART به صورت Ahead-Of-Time (AOT) کار می‌کنه، یعنی در زمان نصب برنامه بایت‌کد ها رو تبدیل می‌کنه. این کار باعث می‌شه نصب برنامه بیشتر زمان ببره و برنامه ها فضای بیشتری اشغال کنن (حدود ۷۵ درصد بیشتر) ولی در زمان اجرا برنامه ها بسیار سریعتر اجرا میشن و باتری کمتری هم مصرف می‌کنن. البته بوت شدن دستگاه هم کندتر هستش چون در زمان بوت شدن شروع به تبدیل بایت‌کد های برنامه ها می‌کنه و پیام Optimizing apps رو نمایش میده.

Android Navigation

راهنمایی پیاده سازی navigation.

ادامه نوشته

Implementation by Delegation

اگه بخواییم یک اینترفیس رو پیاده سازی کنیم ولی تمام متدهای اون رو پیاده سازی نکنیم (یک کلاس دیگه داریم که همون اینترفیس رو پیاده سازی کرده و ما فقط می‌خوایم یکسری تغییر توی اون ایجاد کنیم).

interface Base
class BaseImpl() : Base
class Derived(n: Base) : Base by n

Java Static-Final

final:

  • کلاس final قبل توسعه نیست.
  • متد final قابل بازنویسی نیست.
  • متغییر final قابل مقدار دهی نیست.
  • کلاس abstract را نمی‌توان final کرد.

static:

  • فقط کلاسی که درون یک کلاس دیگر است می‌تواند statis باشد.
  • کلاس static قابلیت نمونه سازی مستقل را دارد.
  • کلاس static قابلیت توسعه را دارد.
  • متد static بدون نیاز به نمونه سازی از کلاس در درسترس است.
  • متد static به صورت پیشفرض final است.
  • متد static بدون بازنویسی ولی با همان نام در کلاس فرزند قابل ساخت است.
  • متد static در نمونه ساخته شده از کلاس در دسترس نیست.
  • متد static قابل بازنویسی override نیست.
  • متغییر static بدون نیاز به نمونه سازی از کلاس در درسترس است.
  • متغییر static final خواص هر دو گروه را دارد.

  • در کلاس‌های تودرتو اگه کلاس داخلی static نباشد، برای نمونه سازی از آن لازم است یک نمونه از کلاس بیرونی ایجاد کنیم.

A a = new A();
A.B b = a.new B();

  • متد های هم نام با کلاس پدر در کلاس فرزند بدون باز نویسی قابل ساختن هستند. بجز متدهای final

Activiy Lifecycle

زمانی که یک اکتیویتی ساخته میشه متدهای onCreate و onStart و onResume به ترتیب فراخوانی می‌شوند تا زمانی که ما اکتیویتی را مشاهده می‌کنیم و زمانی که یک اکتیویتی می‌خواد به کار خودش خاتمه بده متدهای onPause و onStop و onDestroy به ترتیب فراخوانی می‌شوند.

ادامه نوشته

const val VS val

const یک ثابت کامپایل تایم هست، یعنی مقدار آن در زمان کامپایل مشخص می‌شود بر خلاف val که میتوان داده آن را در زمان اجرا مشخص کرد.

این به این معنی است که مقدار const را نمیتوان برابر با یک متد یا یک کلاس قرار داد. مقدار آن باید primitive باشد مانند String.

همچنین const در جاوا public static final می‌شود در حالی که val در جاوا private static final می‌شود.

+ +

Custom View

وقتی یک کلاس View را توصعه میدهد شی canvas در متد onDraw در اختیارش قرار میگیرد.

برای محاسبه ابعاد view وقتی در حالت wrap_content قرار دارد باید متد onMeasuer را پیاده سازی کنیم برای فراخوانی این متد باید تابعد requestLayout را صدا بزنیم.

وقتی یک کلاس ViewGroup را توسعه میدهد باید onLayout را پیاده سازی کند.

در ViewGroup داستان این هستش که ما توی متد onLayout ابعاد layout خودمون رو داریم و فضایی که میخوای به هر کدوم از child ها اختصاص بدیم رو باید محاسبه کنیم و متد layout رو از child ها صدا بزنیم و ابعاد رو بدیم.

اگه child توی صفحه دیده بشه متد onDraw اون صدا زدم میشه و میشه هر کاری که میخوایم رو اونجا انجام بدیم.

دقت داشته باشید که موقعیت ها در اشیای فرزند نثب به خود آنها محاسبه میشود.