1. Mesaj mekanizması İşleyicisinin rolü hakkında konuşur musunuz? Unsurlar nelerdir? Süreç nasıldır?
Referans yanıtı: İş parçacıkları arası iletişimden sorumludur. Bunun nedeni, ana iş parçacığında zaman alıcı işlemlerin yapılamaması ve alt iş parçacığının kullanıcı arayüzünü güncelleyememesidir. Bu nedenle, alt iş parçacığındaki zaman alıcı işlemden sonra kullanıcı arabiriminin güncellenmesi gerektiğinde, kullanıcı arabirimi işlemleri İşleyici aracılığıyla değiştirilir Ana ileti dizisinde yürütün.
Özellikle dört ana unsura ayrılmıştır:
Spesifik süreç aşağıdaki gibidir:
Ana iş parçacığı oluşturulduğunda bir Looper oluşturulacak ve Looper içinde bir mesaj kuyruğu da oluşturulacaktır. Anahtar İşleyiciyi oluştururken, geçerli iş parçacığının Looper'ını çıkarın ve Looper nesnesi aracılığıyla ileti kuyruğunu elde edin ve ardından İşleyici, alt iş parçacığındaki MessageQueue.enqueueMessage aracılığıyla ileti kuyruğuna bir İleti ekler.
Sürekli olarak yoklamak ve MessageQueue.next () 'yi çağırmak için Looper.loop () aracılığıyla mesaj döngüsünü açın, karşılık gelen Mesajı alın ve Handler.dispatchMessage aracılığıyla İşleyiciye iletin ve son olarak mesajı işlemek için Handler.handlerMessage'ı çağırın.
2. Bir iş parçacığı birden fazla İşleyici ve İşleyici ile Looper arasındaki yazışmayı oluşturabilir mi?
Referans yanıtı: Bir İş Parçacığının yalnızca bir Looper, bir MessageQueen ve birden çok İşleyicisi olabilir.
Bir iş parçacığını bir kıyaslama olarak ele alırsak, bunların büyüklük sıralaması ilişkisi: Aşama (1): Looper (1): MessageQueue (1): İşleyici (N).
3. Yumuşak referanslar ve zayıf referanslar arasındaki fark
Referans cevabı:
Önerilen makaleler: Java'da dört tür alıntı: güçlü alıntılar, yumuşak alıntılar, zayıf alıntılar ve hayali alıntılar (https://segmentfault.com/a/1190000015282652)
4. İşleyicinin neden olduğu bellek sızıntısının nedeni ve en iyi çözüm
Sızıntı nedeni: İşleyici, gecikmeli mesajlar göndermemize izin verir.Eğer kullanıcı, gecikme sırasında Aktiviteyi kapatırsa, Aktivite sızdırılacaktır. Bu sızıntı, Mesajın İşleyiciyi tutması ve Java'nın özelliklerinden dolayı iç sınıfın dış sınıfı tutmasıdır, böylece Aktivite İşleyici tarafından tutulacak ve bu da Aktivitenin sızmasına neden olacaktır.
Çözüm: İşleyiciyi statik dahili sınıf olarak tanımlayın, zayıf Activity referansını dahili olarak tutun ve tüm iletileri zamanında kaldırmak için Acitivity'ın onDestroy () öğesinde handler.removeCallbacksAndMessages (null) öğesini çağırın.
5. Sistemin alt iş parçacığındaki kullanıcı arayüzüne erişmesi neden önerilmiyor?
Referans yanıtı: Android kullanıcı arabirimi denetimleri iş parçacığı açısından güvenli değildir ve birden çok iş parçacığında eşzamanlı erişim, kullanıcı arabirimi denetimlerinin beklenmedik bir durumda olmasına neden olabilir.
Şu anda, sistemin UI kontrollerine erişime neden bir kilit mekanizması eklemediğini sorabilirsiniz. Çünkü:
6. Looper'in sonsuz döngüsü uygulamanın donmasına neden olmuyor?
Referans cevabı:
7. İşleyicinin postDealy özelliğini kullandıktan sonra ileti kuyruğuna ne olacak?
Referans cevap: Kuyrukta sadece bu mesaj varsa mesaj gönderilmez, bunun yerine o anda uyanma zamanını hesaplar, önce Looper'ı bloke eder ve o anda uyandırır. Ancak bu sefer yeni bir mesaj eklemek isterseniz, mesaj kuyruğunun karşı başlığı gecikme süresinden daha uzun ise, başlığa yerleştirilir ve tetikleme süresine göre sıralanır.Satırın başındaki zaman en küçüktür ve sondaki zaman en büyüğüdür.
8. Bir İşleyici doğrudan alt iş parçacığı içinde oluşturulabilir mi? Nasıl yapılır?
Referans cevabı: Hayır, çünkü ana iş parçacığında Activity, Looper'ı otomatik olarak yöneten ve alt iş parçacıkları tarafından gönderilen mesajları işleyen bir Looper nesnesi içerir. Alt iş parçacığı için, Looper nesnesini korumamıza yardımcı olacak bir nesne yoktur, bu nedenle onu manuel olarak korumamız gerekir. İşleyiciyi alt iş parçacığında açmak için, önce Looper'ı oluşturmanız ve Looper döngüsünü açmanız gerekir.
Önerilen makale: Android eşzamansız mesaj işleme mekanizması tamamen analiz edilir ve kaynak kodu açısından kapsamlı bir anlayışa sahip olursunuz (https://blog.csdn.net/guolin_blog/article/details/9991569)
9. Bir mesaj nasıl oluşturulabilir? Hangi etki daha iyidir ve neden?
Referans cevabı: Üç şekilde oluşturulabilir:
Son ikisi daha etkilidir, çünkü Android mesaj havuzundaki varsayılan mesaj sayısı 10'dur ve son ikisi, mesaj havuzundan bir Mesaj örneğini doğrudan alır, bu da daha fazla Mesaj örneği oluşturmayı önleyebilir.
1. İş parçacığı havuzlarının faydaları nelerdir? Dört çeşit iş parçacığı havuzu kullanım senaryosu, iş parçacığı havuzunun birkaç parametresinin anlaşılması?
İş parçacığı havuzunu kullanmanın avantajı, iş parçacıkları oluşturmak ve yok etmek için harcanan zamanı ve sistem kaynaklarının ek yükünü azaltmak ve yetersiz kaynaklar sorununu çözmektir. İş parçacığı havuzu kullanılmazsa, sistemin aynı türden çok sayıda iş parçacığı oluşturmasına ve bellek tüketimine veya "aşırı geçiş" sorunlarına neden olabilir. Özet şu şekildedir:
Android'deki iş parçacığı havuzlarının tümü, iş parçacığı havuzlarının farklı özelliklerini elde etmek için doğrudan veya dolaylı olarak ThreadPoolExecutor yapılandırması yoluyla gerçekleştirilir. Android'de farklı özelliklere sahip en yaygın iş parçacığı havuzu türleri şunlardır:
avantaj : Herhangi bir görev hemen yürütülecektir (SynchronousQuue görev kuyruğu boş bir sete eşdeğerdir); çok sayıda görevi daha az zamanda yürütmek için daha uygundur.
avantaj : Dış isteklere daha hızlı yanıt
avantaj : Zamanlama görevlerini ve tekrar eden görevleri belirli bir süre ile gerçekleştirin
avantaj : İş parçacığı senkronizasyon sorunları ile uğraşmanıza gerek yok
Kaynak kodu aracılığıyla, yukarıdaki dört iş parçacığı havuzunun aslında ThreadPoolExecutor sınıfı tarafından uygulandığını anlayabiliriz.
Önerilen makale: Java iş parçacığı havuzu analizi ve dört iş parçacığı havuzunun kullanımı (https://blog.csdn.net/ztchun/article/details/57413255)
2. Android'de iş parçacığı değiştirmeyi kolaylaştıran sınıflar nelerdir?
Referans cevabı:
3. AsyncTask ilkesinden bahsedin:
AsyncTask'ta iki iş parçacığı havuzu (SerialExecutor ve THREAD_POOL_EXECUTOR) ve bir İşleyici (InternalHandler) vardır.SerialExecutor iş parçacığı havuzu görevleri sıralamak için kullanılırken, THREAD_POOL_EXECUTOR iş parçacığı havuzu, görevleri yürütmek için kullanılır ve InternalHandler, iş parçacığı havuzundan yürütme ortamını değiştirmek için kullanılır. Ana konuya.
sHandler statik bir Handler nesnesidir.Çalışma ortamını ana iş parçacığına geçirmek için, bu, sHandler nesnesinin ana iş parçacığında oluşturulması gerekir. Statik üyeler, sınıf yüklendiğinde başlatıldığından, bu, AsyncTask sınıfının ana iş parçacığına kılık değiştirerek yüklenmesi gerekir, aksi takdirde aynı işlemdeki AsyncTask düzgün çalışmayacaktır.
4. IntentService'in kullanımı nedir?
IntentService, arka planda zaman alan görevleri gerçekleştirmek için kullanılabilir.Görev tamamlandığında otomatik olarak duracaktır.Aynı zamanda, IntentService bir hizmet olduğundan, sıradan Hizmetin aksine, IntentService, görevleri gerçekleştirmek için otomatik olarak alt iş parçacıkları oluşturabilir, bu da basitten önceliğine yol açar İş parçacığı yüksek olmalı ve sistem tarafından öldürülmesi kolay olmamalıdır, bu nedenle IntentService bazı yüksek öncelikli arka plan görevlerini gerçekleştirmek için daha uygundur.
5. Doğrudan Activity içinde bir iş parçacığı oluşturmakla hizmette bir iş parçacığı oluşturmak arasındaki fark nedir?
Aktivitede Oluşturuldu: İş Parçacığı bu Aktiviteye hizmet eder, bu belirli Aktivite tarafından atanan görevleri tamamlar ve Aktiviteyi bazı mesajlar ve olaylar hakkında aktif olarak bilgilendirir Aktivite yok edildikten sonra, Konunun hayatta kalmak için bir anlamı yoktur.
Hizmette Oluşturuldu: Bu, İş Parçacığının en uzun yaşam döngüsünü sağlamanın tek yoludur.Hizmetin tamamı çıkmadığı sürece, İş Parçacığı her zaman arka planda çalıştırılabilir. Genellikle Hizmetin onCreate () öğesinde oluşturulur ve onDestroy () öğesinde yok edilir. Bu nedenle, Hizmette oluşturulan İş Parçacığı, APP'den bağımsız olarak bazı arka plan görevlerinin uzun süreli yürütülmesi için uygundur Daha yaygın olanı, Hizmetteki sunucu ile uzun bir bağlantı sürdürmektir.
6. ThreadPoolExecutor'un çalışma stratejisi nedir?
ThreadPoolExecutor, görevleri yerine getirirken aşağıdaki kuralları izleyecektir:
7. İşleyici, İplik ve İşleyici İpliği arasındaki fark nedir?
Referans cevabı:
İşleyici : Diğer şube iş parçacıkları ve ana iş parçacığı arasındaki mesaj iletişiminin gerçekleştirilebildiği android'de mesaj gönderme ve işleme sorumlusu.
Konu : Bir Java işleminde işlemleri gerçekleştirmek için en küçük birim, yani işlemci planlamasını yürütmek için temel birim. Belirli bir süreçte tamamen bağımsız olarak çalışan bir program.
İşleyiciThread : Thread'den miras alınan bir sınıf HandlerThread.Android, Thread'ı Java'da kapsüllemez. Bunun yerine, Thread'den miras alınan bir HandlerThread sınıfı sağlar. Bu sınıf, Java Thread üzerinde çok sayıda kullanışlı kapsülleme yapar. HandlerThread, Thread'den miras alır, bu yüzden aslında bir Thread'dir. Sıradan Thread ile farkı, İşleyici mesaj mekanizması için gerekli olan Looper'ı doğrudan dahili olarak uygulamasıdır. Kendi döngüleyicimiz ile mesajları kendi iş parçacıklarımızda dağıtabilir ve işleyebiliriz. HandlerThread kullanmıyorsanız, Looper.prepare () ve Looper.loop () yöntemlerini manuel olarak çağırmanız gerekir.
8. ThreadLocal ilkesi:
ThreadLocal, iş parçacığı yerel değişkenleri oluşturma hakkında bir sınıftır. Kullanım senaryoları aşağıdaki gibidir:
Birden fazla iş parçacığı kullanmanız gerektiğinde, paylaşılmasına gerek olmayan bir değişken vardır. Şu anda, onu kilitlemek için zahmetli senkronize anahtar sözcüğünü kullanmanıza gerek yoktur. Her iş parçacığı, yığın belleğinde bir alan açmaya eşdeğerdir ve iş parçacıkları paylaşılır Yığın belleğindeki paylaşılan değişkenleri okumak ve çalıştırmak için arabellek aracılığıyla değişken arabellek, ThreadLocal iş parçacığındaki belleğe, yerel bir değişkene eşdeğerdir. Her seferinde, iş parçacığının kendi verileri okunabilir ve çalıştırılabilir ve tampon aracılığıyla ana bellekteki değişkenlerle etkileşime girmeye gerek yoktur. Ana bellekteki verileri senkronize edilmiş gibi değiştirmez ve ardından ana bellekteki verileri iş parçacığındaki çalışma belleğine kopyalar. ThreadLocal, iş parçacığının kaynakları tekelleştirmesine ve iş parçacığı tıkanmasını önlemek ve CPU verimini azaltmak için bunları iş parçacıklarında depolamasına izin verir.
Her iş parçacığı bir ThreadLocalMap içerir, ThreadLocalMap'in anahtarı, ThreadLocal'ın nesnesidir ve değer, özel verilerdir.
9. Çoklu iş parçacığı verimli olacak mı (avantajlar ve dezavantajlar)
Çoklu okumanın avantajları:
Çoklu kullanımın dezavantajları:
Özetle, çoklu iş parçacığı verimliliği artırmayabilir, ancak bellek alanı dar olduğunda bir yüktür. Bu nedenle, günlük geliştirmede şunları deneyin:
10. Çoklu okumada tek bir işlem yapmanıza izin verin, ne yapardınız?
Çoklu kullanımda tekli modun kurulmasında dikkate alınan birçok faktör vardır, örneğin iş parçacığı güvenliği-tembel yükleme kodu güvenliği: serileştirme saldırılarının önlenmesi, yansıma saldırılarının önlenmesi (yansımanın özel yöntem çağrıları yapmasını önleme) -performans faktörleri
Birçok uygulama yöntemi, aç adamlar, tembel adamlar (iş parçacığı güvenli, iş parçacığı güvensiz), çift kontrol (DCL), iç sınıflar ve numaralandırma vardır.
Önerilen makale: Tekli modun özeti (https://xxxblank.github.io/2017/09/14/singleTon/)
11. Bildirime ek olarak, konuları uyandırmanın bir yolu var mı?
Referans cevabı: Object lock'a sahip olan bir iş parçacığı wait () yöntemini çağırdığında, mevcut iş parçacığını object.wait bekleme kuyruğuna ekler ve o anda meşgul olan Object lock'u serbest bırakır, böylece diğer iş parçacıkları Object lock'u alma ve elde etme fırsatına sahip olur. Nesne kilidi iş parçacığı, Object.wait bekleme kuyruğundaki bir iş parçacığını rastgele uyandırmak için notify () yöntemini çağırır (uyandırma rastgele ve katılma sırasıyla ilgisi yoktur, öncelik ne kadar yüksekse, uyanma olasılığı o kadar yüksek olur)
NotifyAll () yöntemi çağrılırsa, tüm iş parçacıkları uyandırılacaktır. Not: Nesne kilidi, notify () yöntemi çağrıldıktan hemen sonra serbest bırakılmayacak ve nesne kilidi, iş parçacığı yürütüldükten sonra serbest bırakılacaktır.
12. ANR nedir, ANR hangi koşullarda gerçekleşir? Nasıl önlenir? Koda bakmadan ANR sorunu nasıl hızlı bir şekilde bulunur?
Önerilen makale: ANR nasıl hızlı bir şekilde analiz edilir ve bulunur (https://www.jianshu.com/p/cfa9ed42e379)
1. Bitmap'i kullanırken hangi sorunlara dikkat edilmelidir?
istemek Doğru resim boyutunu seçin (Bitmap türü): Genellikle Bitmap'i optimize ettiğimizde, performans optimizasyonu yapmamız veya OOM'u önlememiz gerektiğinde, genellikle RGB_565 kullanırız, çünkü ALPHA_8 yalnızca şeffaflığa sahiptir ve sıradan resimleri görüntülemek anlamsızdır.Bitmap.Config.ARGB_4444 resmin net olmadığını gösterir, Bitmap.Config .ARGB_8888 en çok belleği kaplar. :
Örnek oranını azaltın : BitmapFactory.Options parametresini inSampleSize olarak kullanmak için, önce options.inJustDecodeBounds parametresini true olarak ayarlayın, sadece resmin boyutunu okuyun ve resmin boyutunu, resmin boyutunu elde ettikten sonra görüntülenecek boyutla karşılaştırın. İnSampleSize öğesinin belirli değerini hesaplamak için calculateInSampleSize () işlevini kullanın Değeri aldıktan sonra. options.inJustDecodeBounds, görüntü kaynaklarını okumak için false olarak ayarlanır.
Belleği yeniden kullan : Yani, yumuşak referanslar aracılığıyla (bellek yeterli olmadığında geri dönüştürülür), bellek bloğu yeniden kullanılır ve bu bitmap için yeni bir belleğin yeniden uygulanmasına gerek kalmaz, bu da bellek ayırma ve geri dönüşümü önleyerek işletim verimliliğini artırır.
kullanım zamanda geri dönüştürmek için recycle () yöntemi VERİ DEPOSU.
Resmi sıkıştır .
2. Bitmap.recycle () hemen geri dönüştürülecek mi? Ne zaman geri dönüştürülecek? Bu Bitmap'i kullanacak yer yoksa, çöp toplama neden doğrudan geri dönüştürülmüyor?
3. Bir Bitmap tarafından kullanılan bellek ve kullanılan belleğin hesaplanması?
Referans cevap: Bitamp tarafından kullanılan bellek boyutu = genişlik pikseli x (inTargetDensity / inDensity) x yükseklik pikseli x (inTargetDensity / inDensity) x bir pikselin kapladığı bellek bayt boyutu
Not: Burada inDensity, hedef görüntünün dpi'sini (hangi kaynak klasöründe) temsil eder, inTargetDensity hedef ekranın dpi'sini temsil eder, böylece inDensity ve inTargetDensity'nin Bitmap'in genişliğini ve yüksekliğini uzatacağını ve böylelikle Bitmap'in kapladığı belleğin boyutunu değiştireceğini görebilirsiniz.
Bitmap'te bellek ayak izini almanın iki yolu vardır.
4. Android'de önbellek güncelleme stratejisi nedir?
Android'in önbellek güncelleme stratejisinin birleşik bir standardı yoktur. Genel olarak, önbellek stratejisi temel olarak önbelleği ekleme, alma ve silme olmak üzere üç tür işlemi içerir, ancak ister bir bellek önbelleği ister bir depolama cihazı önbelleği olsun, önbellek kapasitesi sınırlıdır, bu nedenle Bazı eski önbellekleri silin ve yenilerini ekleyin Eski ve yeni önbelleklerin nasıl tanımlanacağı bir stratejidir.Farklı stratejiler, farklı önbellek algoritmalarına karşılık gelir.
Örneğin, basitçe yeni ve eski önbelleği dosyanın son değişiklik zamanına göre tanımlayabilir ve önbellek dolduğunda önceki son değişiklik zamanına sahip önbelleği kaldırabilirsiniz.Bu bir önbellek algoritmasıdır, ancak mükemmel değildir.
5. LRU ilkesi?
Referans cevap: Trafik tüketimini azaltmak için bir önbelleğe alma stratejisi kullanılabilir. Yaygın olarak kullanılan önbellek algoritması LRU'dur (En Son Kullanılanlar): Önbellek dolduğunda, en son kullanılan önbellek nesneleri ilk önce ortadan kaldırılacaktır. Esas olarak iki yol vardır:
Hepsi bugünün röportaj paylaşımı için. Aynı cümle. Sadece anlamanız gereken değil, aynı zamanda onları iyi ifade etmeniz gereken bazı şeyler var, böylece görüşmecinin Anlayışınızı tanıyabilmesi için İşleyici mekanizması gibi. Bu, röportajda mutlaka sorulması gereken bir sorudur. . Bazı belirsiz noktalar var, belki sadece röportajda yaşıyor, gerçek işte hiç kullanmayacaksın ama ne olduğunu bilmelisin.
Son olarak, buradaki editör, yukarıdaki teknik sistem şemalarıyla ilgili düzinelerce set koleksiyonunu paylaşıyor. Tencent, Toutiao, Ali, Meituan ve diğer şirketlerden 19 yıl içinde mülakat soruları , Teknik noktaları video ve PDF olarak düzenledi (aslında beklenenden çok daha fazla enerji harcadı), Bilgi bağlamı + birçok ayrıntı , Sınırlı alan nedeniyle, işte resim şeklinde bir parçası.
ve ayrıca Gelişmiş mimari teknolojisi gelişmiş zihin haritası, Android geliştirme röportajı özel materyalleri , Herkesin ileri seviyeyi geliştirmeyi öğrenmesine yardımcı olmak için gelişmiş gelişmiş çerçeve materyalleri ve ayrıca internette öğrenmek için materyal aramak için herkesin zamanından tasarruf sağlar ve ayrıca birlikte öğrenmek için arkadaşlarla paylaşılabilir.
[Android temel ileri teknoloji PDF belgesi, BAT görüşmesindeki gerçek soruların analizi]
[Algoritma Koleksiyonu]
[Android temel bilgi noktalarını genişletin]
[Gelişmiş mimari video öğrenme kaynaklarının Android bölümü]
Android Tanıtım Videosu alıp öğrendikten sonra, daha da güçlü hale geliyor! BATJ fabrikasına girin ve benzeri (hazırlık)! Günümüzde İnternetin soğuk olduğu söyleniyor. Aslında, yanlış arabaya bindiğinizden ve daha az (beceri) giydiğinizden başka bir şey değil. Doğru arabaya binerseniz ve kendi teknik yeteneğiniz yeterince güçlüyse, şirketin değişim maliyeti yüksek olacaktır. Sadece son iş Curd'u ortadan kaldırmak için! Günümüzde piyasada genç programcılar akınına uğramaktadır. Bu eğitim seti 1-6 yaş arası Android geliştirme mühendislerine yöneliktir. Darboğaz dönemindedirler. Gelecek yıl maaş artışlarını aşmak isteyenler, ileri düzey Android orta ve kıdemli, mimarlar daha da önemlidir Sudaki bir balık gibi, çabuk alın!
[Android gelişmiş öğrenme videosu], [Android mülakat hilelerinin tam seti PDF], [Android geliştirme temel bilgi notları] özel mesajla [Android] ücretsiz olarak elde edilebilir!