Orta Düzey ve Orta Düzeyler için Öne Çıkan Android Mülakat Soruları: İşleyiciye Derinlemesine İnceleme, Çoklu Okuma, Bitmap

İşleyici

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:

  • Mesaj: Teslim edilmesi gereken mesaj Mesajlar, donanım tarafından oluşturulan mesajlar (düğmeler ve dokunuşlar gibi) ve yazılım tarafından oluşturulan mesajlara bölünmüştür.
  • MessageQueue (Message Queue): Mesajların depolanmasından ve yönetiminden ve İşleyici tarafından gönderilen Mesajların yönetiminden sorumludur. Okumak, mesajları otomatik olarak silecektir ve tek bağlantılı liste bakımı, ekleme ve silme işlemlerinde avantajlar vardır. Next () yönteminde, bir mesajın olup olmadığını sürekli olarak yargılayarak süresiz olarak döngü yapar ve ardından mesajı döndürür ve kaldırır.
  • İşleyici (mesaj işlemcisi): Mesajın gönderilmesi ve işlenmesinden sorumludur. Temelde çeşitli mesaj olaylarını (Handler.sendMessage ()) gönderin ve ilgili mesaj olaylarını (Handler.handleMessage ()) ilk giren ilk çıkar yürütmeye göre mesaj havuzuna işleyin, tek bağlantılı listenin yapısı dahili olarak kullanılır.
  • Looper (mesaj havuzu): İlişkili iş parçacığından ve mesajların dağıtımından sorumludur.Bu iş parçacığı altında, Mesaj, MessageQueue'dan alınır ve İşleyiciye dağıtılır.Looper oluşturulduğunda, bir MessageQueue oluşturulur. Loop () yöntemi çağrıldığında, mesaj döngüsü başlar ve devam eder MessageQueue'nun next () yöntemini çağırın ve bir mesaj olduğunda bunu işleyin, aksi takdirde messageQueue'nun next () yönteminde engellenecektir. Looper'ın quit () çağrıldığında, messageQueue'nun quit () 'ini çağıracaktır Bu zamanda, next () null döndürecektir ve sonra loop () metodu çıkacaktı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ı:

  • Yumuşak Referans (SoftReference): Bir nesnenin yalnızca yazılımsal referansları varsa, çöp toplayıcı bellek alanı yeterli olduğunda onu geri talep etmeyecektir; bellek alanı yetersizse, bu nesnelerin belleği geri kazanılacaktır. Çöp toplayıcı onu geri istemediği sürece, nesne program tarafından her zaman kullanılabilir.
  • Zayıf Referans (WeakReference): Bir nesnenin yalnızca zayıf referansları varsa, o zaman çöp toplayıcı iş parçacığı taraması sürecinde, yalnızca zayıf referanslara sahip bir nesne bulunduğunda, mevcut bellek alanının yeterli olup olmadığına bakılmaksızın belleği geri kazanılacaktır.
  • İkisi arasındaki temel fark, yalnızca zayıf referanslara sahip nesnelerin daha kısa bir yaşam döngüsüne sahip olması ve herhangi bir zamanda geri dönüştürülebilmesidir. Yalnızca yazılım referansları olan nesneler yalnızca bellek yetersiz olduğunda geri dönüştürülür ve genellikle bellek yeterli olduğunda geri dönüştürülmez.

Ö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ü:

  • Kilitleme mekanizması, UI erişim mantığını karmaşık hale getirecek
  • Kilitleme mekanizması, UI erişiminin verimliliğini azaltacaktır çünkü kilitleme, bazı iş parçacığının yürütülmesini engelleyecektir.

6. Looper'in sonsuz döngüsü uygulamanın donmasına neden olmuyor?

Referans cevabı:

  • Ana iş parçacığının ana yöntemi ileti döngüsünden çıktıktan sonra uygulamanız da çıkacaktır. Looer.loop () yöntemi ana iş parçacığının engellenmesine neden olabilir, ancak ileti döngüsü engellenmediği sürece işlenebilir. Olay bir ANR istisnası oluşturmayacaktır.
  • ANR'ye neden olan ana iş parçacığı engellemesi değil, hareket işlemlerine yanıt veremeyen ve kullanıcı arabirimini zamanında yenileyemeyen ana iş parçacığının Looper mesaj işleme sürecinin görev engellemesidir.
  • Engelleme, mutlaka programın yanıt vermemesiyle ilgili değildir.İşlenecek mesaj olmadığında ana iş parçacığı bloke edilmesine rağmen, bir mesaj olduğunda hemen işlenebildiği sürece program yanıt vermeyecektir.

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:

  • Doğrudan örnek oluştur Mesaj m = yeni Mesaj
  • Geçiş Mesajı m = Message.obtain
  • İletiyi İlet m = mHandler.obtainMessage ()

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.

Konu

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:

  • Mevcut iş parçacıkları yeniden kullanın, nesne oluşturma ve ölümden kaynaklanan ek yükü azaltın ve iyi performans elde edin.
  • Maksimum eşzamanlı iş parçacığı sayısını etkin bir şekilde kontrol edebilir, sistem kaynaklarının kullanım oranını artırabilir ve aşırı kaynak rekabetinden ve tıkanmasından kaçınabilir.
  • Zamanlama yürütme, düzenli yürütme, tek iş parçacığı, eşzamanlı sayı denetimi ve diğer işlevleri sağlayın.

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:

  • newCachedThreadPool: Yalnızca çekirdek olmayan iş parçacığı vardır ve maksimum iş parçacığı sayısı çok büyüktür.Tüm iş parçacıkları etkin olduğunda, yeni görevler için yeni iş parçacıkları oluşturulacak, aksi takdirde boştaki iş parçacıkları kullanılacaktır (60 saniye boşta kalma süresi, 60 saniyeden sonra bunlar geri dönüştürülecek, bu nedenle iş parçacığı havuzunda 0 iş parçacığı vardır Mümkün) görevi yerine getirmek.

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.

  • newFixedThreadPool: Yalnızca çekirdek iş parçacıkları ve sabit bir sayı vardır.Tüm iş parçacıkları etkin olduğunda, kuyruğun boyutta sınırı olmadığından, yeni görevler yürütülmeyi bekleyecektir. İş parçacığı havuzu boşta olduğunda, çalışan iş parçacıkları serbest bırakılmayacak ve belirli sistem kaynakları kullanılacaktır.

avantaj : Dış isteklere daha hızlı yanıt

  • newScheduledThreadPool: Çekirdek iş parçacığı sayısı sabittir ve çekirdek olmayan iş parçacıkları için bir sınır yoktur (bunların sayısı işsiz boşta kalırsa hemen geri dönüştürülecektir).

avantaj : Zamanlama görevlerini ve tekrar eden görevleri belirli bir süre ile gerçekleştirin

  • newSingleThreadExecutor: Tüm görevlerin aynı iş parçacığı içinde sırayla tamamlanmasını sağlayan tek bir çekirdek iş parçacığı vardır

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ı:

  • AsyncTask: Alt katman, arka plan görevlerinin ve alt iş parçacıkları içindeki UI işlemlerinin yürütülmesini kolaylaştıran iş parçacığı havuzunu ve İşleyiciyi kapsüller.
  • HandlerThread: İşleyicinin kullanılabileceği bir ileti döngüsüne sahip bir iş parçacığı.
  • IntentService: Otomatik olarak duracak zaman uyumsuz bir hizmettir, HandlerThread dahili olarak kullanılır.

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:

  • İş parçacığı havuzundaki iş parçacığı sayısı çekirdek iş parçacığı sayısına ulaşmazsa, görevi gerçekleştirmek için doğrudan bir çekirdek iş parçacığı başlatılır.
  • İş parçacığı havuzundaki iş parçacığı sayısı çekirdek iş parçacığı sayısına ulaştıysa veya aştıysa, görev görev kuyruğuna eklenir ve yürütülmek üzere kuyruğa alınır.
  • Görev, ikinci noktada görev kuyruğuna eklenemiyorsa, bunun nedeni genellikle görev kuyruğunun dolu olmasıdır.Şu anda, iş parçacığı sayısı iş parçacığı havuzu tarafından belirtilen maksimum değere ulaşmazsa, görevi gerçekleştirmek için hemen çekirdek olmayan bir iş parçacığı başlatılacaktır.
  • 3. noktadaki iş parçacığı sayısı, iş parçacığı havuzu tarafından belirtilen maksimum değere ulaştıysa, görev reddedilir ve ThreadPoolExecutor, arayan kişiye bildirimde bulunmak için ReddedExecutionHandler'ın reddedilen Yürütme yöntemini çağırır.

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:

  • Tek iş parçacığı tek örneği ve işlem kimliği vb. Gibi tek iş parçacığı bağlamı bilgi depolamasını gerçekleştirin.
  • İş parçacığı güvenliğini sağlamak için, iş parçacığı güvenli olmayan nesneler, ThreadLocal kullanıldıktan sonra iş parçacığı güvenli hale gelecektir, çünkü her iş parçacığının karşılık gelen bir örneği olacaktır. İş parçacığı ile ilgili bazı verileri taşıyın, yöntemde parametreleri ileri geri iletmekten kaçının.

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ı:

  • Birden çok işlem altında uygun ve verimli bellek paylaşımı-bellek paylaşımı sakıncalıdır ve çok işlemli programlamanın faydalarını dengeleyecektir
  • Daha hafif bağlam anahtarlama ek yükü - adres alanını değiştirmeye gerek yok, CR3 kaydını değiştirmeye gerek yok, TLB'yi temizlemeye gerek yok
  • İş parçacığındaki görev, yürütmeden sonra otomatik olarak yok edilir

Çoklu kullanımın dezavantajları:

  • İş parçacığı başlatmak belirli miktarda bellek alanı gerektirir (varsayılan olarak, her iş parçacığı 512 KB kaplar)
  • Çok sayıda iş parçacığı açarsanız, çok fazla bellek alanı kaplar ve programın performansını düşürür.
  • Ne kadar çok iş parçacığı olursa, cpu'nun çağrı iş parçacığı üzerinde o kadar fazla ek yükü vardır
  • İş parçacıkları arasındaki iletişim ve çok iş parçacıklı veri paylaşımı gibi program tasarımı daha karmaşıktır

Ö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:

  • Sık sık iş parçacığı oluşturmayın ve yok etmeyin, iş parçacığı havuzlarını kullanın
  • İş parçacıkları arasındaki senkronizasyonu ve iletişimi azaltın (en kritik olanı)
  • Yazılı verilerin sık sık paylaşılmasından kaçının
  • Yanlış paylaşımdan kaçınmak için paylaşılan veri yapısını makul şekilde düzenleyin
  • Engellemeyen veri yapıları / algoritmaları kullanın
  • Ölçeklenebilirlik sorunlarına (mmap gibi) neden olabilecek sistem çağrılarından kaçının
  • Çok sayıda sayfa hatasından kaçınmak için Büyük Sayfayı kullanmayı deneyin
  • Mümkünse çekirdek iş parçacıkları yerine kullanıcı modu hafif iş parçacıkları kullanın

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?

  • ANR (Uygulama Yanıt Vermiyor, uygulama yanıt vermiyor): İşlem bir süre işlenemediğinde, ANR iletişim kutusu sistem düzeyinde açılır
  • ANR, 5 saniye içinde kullanıcı giriş olaylarına yanıt verilmediğinden, BroadcastReceiver 10 saniye içinde sonlandırılmadığından ve Hizmet 20 saniye içinde sonlandırılmadığından oluşturulabilir
  • ANR'den kaçınmak istiyorsanız, ana iş parçacığında zaman alıcı işlemler yapmayın, ancak Thread'i devralma veya Runnable arabirimini uygulama, AsyncTask, IntentService, HandlerThread vb.

Önerilen makale: ANR nasıl hızlı bir şekilde analiz edilir ve bulunur (https://www.jianshu.com/p/cfa9ed42e379)

Bit eşlem

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. :

  • ALPHA_8 Her piksel 1 bayt hafıza kaplar
  • ARGB_4444 her piksel 2 bayt hafıza kaplar
  • ARGB_8888 her piksel 4 bayt bellek kullanır (varsayılan)
  • RGB_565 Her piksel 2 bayt bellek kullanır

Ö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?

  • Kaynak kodundan, Bitmap'i belleğe yükledikten sonra bellek alanının iki bölümünü içerdiği anlaşılabilir. Basitçe söylemek gerekirse, bir kısım Java kısmı ve diğer kısım C kısmıdır. Bu Bitmap nesnesi kısmen Java tarafından ayrılır ve sistem kullanılmadığında onu otomatik olarak geri dönüştürür.
  • Ancak C için mevcut olan karşılık gelen bellek alanı, sanal makine tarafından doğrudan geri dönüştürülemez.Bu, yalnızca temeldeki işlev çağrılarak serbest bırakılabilir. Dolayısıyla, C bölümünün belleğini serbest bırakmak için recycle () yöntemini çağırmanız gerekir
  • Bitmap.recycle () yöntemi, Bitmap tarafından kullanılan belleği geri kazanmak, ardından bitmap'i boşaltmak ve son olarak sistemin çöp toplayıcısını geri dönüşüm için çağırmak için System.gc () 'yi kullanmak için kullanılır.System.gc ()' yi çağırmak, hemen başlatmayı garanti etmez Geri dönüşüm sürecini gerçekleştirin, ancak sadece geri dönüşümün gelişini hızlandırmak için.

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.

  • getByteCount (): Bitmap'in piksellerini depolamak için gereken minimum belleği temsil eden API12 eklendi.
  • getAllocationByteCount (): getByteCount () yöntemi yerine bellekte Bitmap için ayrılan bellek boyutunu temsil eden API19 eklendi.
  • Bitmap yeniden kullanılmadığında, getByteCount () ve getAllocationByteCount tarafından döndürülen sonuçlar aynıdır. Bitmap'i yeniden kullanarak resimlerin kodunu çözerken, getByteCount () yeni kodu çözülen resmin bellek boyutunu belirtir ve getAllocationByteCount () yeniden kullanılan Bitmap'in gerçek bellek boyutunu belirtir

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:

  • LruCache (bellek önbelleği) : LruCache sınıfı, iş parçacığı açısından güvenli bir genel sınıftır: harici önbellek nesnelerini güçlü bir başvuru biçiminde depolamak için dahili olarak bir LinkedHashMap kullanır ve önbellek edinme ve ekleme işlemlerini tamamlamak için alma ve koyma yöntemleri sağlar.Önbellek dolduğunda kaldırılacaktır. Daha önce kullanılan önbellek nesneleri için yeni önbellek nesneleri ekleyin.
  • DiskLruCache (disk önbelleği) : Önbelleğe alınan nesneyi dosya sistemine yazarak önbellek etkisini gerçekleştirin

Sonunda

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!

Üç yıllık Android deneyimi, bu 70 mülakat sorusuyla 3 teklif aldım
önceki
Android kıdemli mühendis görüşmesi için gerekli bilgisayar ağının temelleri
Sonraki
Android mülakat soruları güncellenmeye devam ediyor: Lütfen bu DingTalk ve Douyin mülakatlarını büyük mülakatçılarla saklayın!
Android yüz yüze paylaşım: 9 şirketle görüştüm, dikkat edilmesi gereken bu teknik noktaları özetledim
Kıdemli Android geliştiricileri size şunu söylüyor: Özgeçmişinizi böyle yazın ve röportaj görüşmesi yumuşaktır!
Andrews'ın soğuk kışında iş atlama ve maaş artışı gibi gelişmiş geliştirme deneyimi paylaşılır, böylece mülakat geçiş oranı iki katına çıkar!
Android Orta Düzey ve İleri Düzey Mülakat Soruları Sürekli Destek: Android Bağlayıcı Mekanizmasını Gösterme
Android geliştiricilerinin zorlu yolculuğunu geri sayın: o yıllarda hepimizin yaptığı hatalar
Android Bilgi Notları: 2 "yanlış anlaşılan" Android bilgi puanını kaydedin
Görüşme sırasında hangi konulara dikkat edilmelidir? İşte programcı iş görüşmelerinin 66 detayı
Android röportajları için temel bilgi noktaları: Android'de Handler hakkında sekiz önemli sorunun bir özeti
Yıl ortasında Ali'ye tekrar katılmak için iyi bir zaman, Ali'ye katılmak istersem ne yapmalıyım?
Android programcıları: İyi bir iş bulmak ve salgın krizi kırmak için mülakata nasıl hazırlanılır?
"Bir günde röportaj için nasıl hazırlandım ve Tencent teklifini nasıl aldım?"
To Top