آموزش جاوا و اندروید

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

آموزش جاوا و اندروید

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

طبقه بندی موضوعی

کلاس جنریک:

class ArrayUtil<T>(private val array : Array<T>) {

    fun findElement(element : T, foundElement:(index: Int, element: T?)->Unit){

        for(i in array.indices){

            if(array[i] == element){
                foundElement(i, element)
                return
            }
        }

        foundElement(-1, null)
        return

    }

}

۰ نظر موافقین ۰ مخالفین ۰ ۲۰ آذر ۰۲ ، ۱۶:۳۷
میم دال

gradle یک ابزار بیلد اتوماتیک هست برای بیلد اپلیکیشن ها، مثل اپ های اندرویدی. توسط پلاگین gradle امکان استفاده از gradle در اندروید استودیو فراهم می شود.

۰ نظر موافقین ۰ مخالفین ۰ ۱۸ آذر ۰۲ ، ۱۴:۴۴
میم دال

1. توسط پلاگین gradle امکان استفاده از gradle در اندروید استودیو ایجاد میشه. پس ما برای هر پروژه باید پلاگین gradle و خود gradle رو اضافه کنیم.

 

2. دو تا build.gradle داریم. یکی در "کل پروژه" و یکی "برای هر ماژول". ممکنه پروژه ما چند تا ماژول داشته باشه، در این صورت به ازای هر ماژول یک build.gradle داریم که توش اطلاعات در مورد پلاگین ها، وابستگی ها و مین و ماکس sdk و کامپایل و اینا توضیح داده شده.

توی build.gradle در سطح پروژه، classpathها (مثل کاتلین، gradle، هیلت و ...) آورده میشه و یک سری تسک هایی که gradle انجام میده رو میشه در این قسمت آورد. این تنظیمات برای کل پروژه اعمال میشه.

نکته: هر چی توی classPath آوردیم، پلاگین هم داره!

 

3. اگر کل پروژه به یه وابستگی نیاز داشته باشه در buildScript در قالب classPath بهش میدیم. اگر ماژول به وابستگی نیاز داشته باشه در dependencies بهش میدیم.

 

 

۰ نظر موافقین ۰ مخالفین ۰ ۱۶ آذر ۰۲ ، ۱۷:۵۰
میم دال

.

۰ نظر موافقین ۰ مخالفین ۰ ۱۶ آذر ۰۲ ، ۱۷:۴۴
میم دال

انوتیشن Binds@

از این انوتیشن فقط برای تزریق اینترفیس استفاده میشه. در کل استفاده از چندان توصیه نمیشه.

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

 

interface SomeInterface{
    fun getAllThings() : String
}

و کلاس زیر اون رو پیاده سازی کرده باشه:

 

class SomeInterfaceImpl @Inject constructor() : SomeInterface{
    override fun getAllThings(): String {
        return "A Thing"
    }
}

در این صورت کلاس ماژول حتما باید از نوع abstract باشه و خود متد تزریق هم باید از نوع abstract باشه:

 

@Module
@InstallIn(ActivityComponent::class)
abstract class MyModule{

    @Binds
    @ActivityScoped
    abstract fun bindSomeDependency(
        someImpl : SomeInterfaceImpl
    ) : SomeInterface
}

 

۰ نظر موافقین ۰ مخالفین ۰ ۰۲ آذر ۰۲ ، ۱۶:۲۱
میم دال

معرفی انوتیشن های hilt:

1. ابتدا می بایست کلاس application را اکستند کرده و انوتیشن زیر را قبل از معرفی کلاس بنویسیم:

HiltAndroidApp@

2. استفاده از انوتیشن زیر به معنی این است که میشه در این کلاس آبجکت inject کرد:

AndroidEntryPoint@

 

3. استفاده از Inject@ در کانستراکتور یک کلاس به این معنی است که شی این کلاس تزریق خواهد شد. به صورت زیر:

 

class MyClass @Inject constructor(وابستگی ها)  { }

 

در این کلاس اگر وابستگی وجود داشته باشه و در کلاس module وابستگی ها تعریف شده باشن، وابستگی ها تزریق میشن.

 

4. برای تزریق context قبلش از انوتیشن ApplicationContext@ استفاده میکنیم.

 

 

۰ نظر موافقین ۰ مخالفین ۰ ۲۴ آبان ۰۲ ، ۰۴:۱۱
میم دال

کتابخانه های ktx در اندروید یه سری API جدید و ساده با استفاده از لامبدا اینا برای ما ایجاد میکنن. این لایبرری ها رو باید به صورت دستی در پروژه اضافه کنیم. یکی از بهترین هاش که معمولا استفاده میشه، برای instance کردن ویو مدل هست که توسط delegation انجام میشه. 

 

private val myViewModel : MyViewModel by viewModels() //لایف سایکل متصل به فرگمنت
private val myViewModel1 by viewModels<MyViewModel>() //لایف سایکل متصل به فرگمنت 
private val myViewModel2 : MyViewModel by activityViewModels() // لایف سایکل متصل به اکتیویتی

 

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

 

روش کلاسیک ایجاد ویومدل:

 

val vm = ViewModelProvider(this).get(MyViewModel::class.java)

 

ایجاد ویو مدل با استفاده از lazy:

 

private val MyViewModelby lazy {
    ViewModelProvider(this).get(MyViewModel::class.java)
}

 

۰ نظر موافقین ۰ مخالفین ۰ ۲۲ مهر ۰۲ ، ۰۳:۵۸
میم دال

برای push کردن فاینال، اول باید باید pull بگیری. برای اینکه ممکنه از قبل آپدیتی وجود داشته باشه یا پروژه لوکال به هر علت ایراد داشته باشه.

وقتی pull بگیری ممکنه conflict بده. در این صورت merge میکنی و در نهایت تغییرات رو push میکنی.

 

از merge بدم میاد واقعا :|

 

 

۰ نظر موافقین ۰ مخالفین ۰ ۱۷ مهر ۰۲ ، ۱۳:۵۸
میم دال

وقتی یه کلاسی لود میشه تمامی فیلدهای اون هم لود میشن. بعضی از آبجکت ها سنگین هستن (مثل دیتابیس اینا) و initial شدن اونها کاست زیادی داره. به همین خاطر از lazy توی کاتلین استفاده میشه و باعث میشه به محض استفاده از اون آبجکت، لود بشه.

 

مثال:

۰ نظر موافقین ۰ مخالفین ۰ ۱۱ مهر ۰۲ ، ۲۰:۳۴
میم دال