gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網
最全最豐富的資訊網站

Android開發者面試阿里等大廠遇到的問題整理

推薦:《2020年Android面試題大匯總【收藏】》

先簡單說說我這四年期間的面試經歷吧。面試的公司很多,其中有讓我心血沸騰的經歷,也有讓我感到失望到無助的經歷,我將這些體會都記錄下來,細想之后很值得,面了這么多公司,要是最后什么也沒有留下來,那就太浪費了。至少對于我來說有些東西在整理總結之后才能得到一個肯定的答案。希望這些能對即將換工作或者打算看看機會的你有一些幫助。

以下問題的答案均是個人四年來多次面試實踐中整理的,如有不同意見,歡迎斧正。

1.自定義Handler時如何避免內存泄漏

答案:

一般非靜態內部類持有外部類的引用的情況下,造成外部類在使用完成后不能被系統回收內存,從而造成內存泄漏。為了避免這個問題,我們可以自定義的Handler聲明為靜態內部類形式,然后通過弱引用的方式,讓Handler持有外部類的引用,從而可避免內存泄漏問題。

以下是代碼實現

public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; private TextView mTextView; private WeakReference<MainActivity> activityWeakReference; private MyHandler myHandler;  static class MyHandler extends Handler {     private MainActivity activity;      MyHandler(WeakReference<MainActivity> ref) {         this.activity = ref.get();     }      @Override     public void handleMessage(Message msg) {         super.handleMessage(msg);         switch (msg.what) {            case 1:                 //需要做判空操作                if (activity != null) {                     activity.mTextView.setText("new Value");                 }                break;             default:                 Log.i(TAG, "handleMessage: default ");                break;         }      } }  @Override protected void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);     //在onCreate中初始化     activityWeakReference = new WeakReference<MainActivity>(this);     myHandler = new MyHandler(activityWeakReference);      myHandler.sendEmptyMessage(1);     mTextView = (TextView) findViewById(R.id.tv_test); } }復制代碼

參考博文blog.csdn.net/ucxiii/arti…

2.onNewIntent()的調用時機

解析:

在Android應用程序開發的時候,從一個Activity啟動另一個Activity并傳遞一些數據到新的Activity上非常簡單,但是當您需要讓后臺運行的Activity回到前臺并傳遞一些數據可能就會存在一點點小問題。

首先,在默認情況下,當您通過Intent啟到一個Activity的時候,就算已經存在一個相同的正在運行的Activity,系統都會創建一個新的Activity實例并顯示出來。為了不讓Activity實例化多次,我們需要通過在AndroidManifest.xml配置activity的加載方式(launchMode)以實現單任務模式,如下所示:

<activity  android:label="@string/app_name"android:launchmode="singleTask"android:name="Activity1"> </activity>復制代碼

launchMode為singleTask的時候,通過Intent啟到一個Activity,如果系統已經存在一個實例,系統就會將請求發送到這個實例上,但這個時候,系統就不會再調用通常情況下我們處理請求數據的onCreate方法,而是調用onNewIntent方法

答案:

前提:ActivityA已經啟動過,處于當前應用的Activity堆棧中; 當ActivityA的LaunchMode為SingleTop時,如果ActivityA在棧頂,且現在要再啟動ActivityA,這時會調用onNewIntent()方法 當ActivityA的LaunchMode為SingleInstance,SingleTask時,如果已經ActivityA已經在堆棧中,那么此時會調用onNewIntent()方法

當ActivityA的LaunchMode為Standard時,由于每次啟動ActivityA都是啟動新的實例,和原來啟動的沒關系,所以不會調用原來ActivityA的onNewIntent方法,仍然調用的是onCreate方法

以下是代碼實例

1.設置MainActivity的啟動模式為SingleTask(棧內復用)

<activity android:name=".MainActivity"android:launchMode="singleTask"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />         </intent-filter>     </activity>復制代碼

2.MainActivity中重寫onNewIntent方法

package code.xzy.com.handlerdemo; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.Toast; public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; private Button mButton;  @Override protected void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);     mButton = (Button) findViewById(R.id.forward_btn);     mButton.setOnClickListener(new View.OnClickListener() {         @Override         public void onClick(View view) {             startActivity(new Intent(MainActivity.this, Main2Activity.class));         }     });  }  @Override protected void onNewIntent(Intent intent) {     Toast.makeText(this, "onnewIntent", Toast.LENGTH_SHORT).show();     Log.i(TAG, "onNewIntent: i done...."); } }復制代碼

3.Main2Actvity執行點擊跳轉,MainActivity被復用,執行onNewIntent方法

package code.xzy.com.handlerdemo; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; public class Main2Activity extends AppCompatActivity { private Button mButton;  @Override protected void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main2);      mButton = (Button)findViewById(R.id.btn);      mButton.setOnClickListener(new View.OnClickListener() {         @Override         public void onClick(View view) {             startActivity(new Intent(Main2Activity.this,MainActivity.class));             finish();         }     }); } }

打印截圖

**這里分享一份全套體系化高級架構視頻;**七大主流技術模塊,視頻+源碼+筆記(文末有詳細面試資料專題整理包分享

3.RecyclerView相比ListView有哪些優勢

解析:

首先需要解釋下RecyclerView的這個名字了,從它類名上看,RecyclerView代表的意義是,我只管Recycler View,也就是說RecyclerView只管回收與復用View,其他的你可以自己去設置。可以看出其高度的解耦,給予你充分的定制自由(所以你才可以輕松的通過這個控件實現ListView,GirdView,瀑布流等效果)

其次RecyclerView提供了添加、刪除item的動畫 效果,而且可以自定義

RecyclerView相比ListView優勢在于可以輕松實現:

  1. ListView的功能
  2. GridView的功能
  3. 橫向ListView的功能
  4. 橫向ScrollView的功能
  5. 瀑布流效果
  6. 便于添加Item增加和移除動畫

不過一個挺郁悶的地方就是,系統沒有提供ClickListener和LongClickListener。 不過我們也可以自己去添加,只是會多了些代碼而已。 實現的方式比較多,你可以通過mRecyclerView.addOnItemTouchListener去監聽然后去判斷手勢,

當然你也可以通過adapter中自己去提供回調

參考

jcodecraeer.com/a/anzhuokai… blog.csdn.net/lmj62356579… www.360doc.com/content/16/…

4.談一談Proguard混淆技術

答案:

Proguard技術有如下功能:

壓縮 –檢查并移除代碼中無用的類 優化–對字節碼的優化,移除無用的字節碼 混淆–混淆定義的名稱,避免反編譯

預監測–在java平臺對處理后的代碼再次進行檢測

代碼混淆只在上線時才會用到,debug模式下會關閉,是一種可選的技術。

那么為什么要使用代碼混淆呢?

因為Java是一種跨平臺的解釋性開發語言,而java的源代碼會被編譯成字節碼文件,存儲在.class文件中,由于跨平臺的需要,java的字節碼中包含了很多源代碼信息,諸如變量名、方法名等等。并且通過這些名稱來訪問變量和方法,這些變量很多是無意義的,但是又很容易反編譯成java源代碼,為了防止這種現象,我們就需要通過proguard來對java的字節碼進行混淆,混淆就是對發布的程序進行重新組織和處理,使得處理后的代碼與處理前的代碼有相同的功能,和不同的代碼展示,即使被反編譯也很難讀懂代碼的含義,哪些混淆過的代碼仍能按照之前的邏輯執行得到一樣的結果。

但是,某些java類是不能被混淆的,比如實現了序列化的java類是不能被混淆的,否則反序列化時會出問題。

下面這類代碼混淆的時候要注意保留,不能混淆。

  • Android系統組件,系統組件有固定的方法被系統調用。
  • 被Android Resource 文件引用到的。名字已經固定,也不能混淆,比如自定義的View 。
  • Android Parcelable ,需要使用android 序列化的。

其他Anroid 官方建議 不混淆的,如

  • android.app.backup.BackupAgentHelper?
  • android.preference.Preference?
  • com.android.vending.licensing.ILicensingService?
  • Java序列化方法,系統序列化需要固定的方法。?
  • 枚舉 ,系統需要處理枚舉的固定方法。?
  • 本地方法,不能修改本地方法名?
  • annotations 注釋?
  • 數據庫驅動?
  • 有些resource 文件用到反射的地方

5.ANR出現的場景及解決方案

在Android中,應用的響應性被活動管理器(Activity Manager)和窗口管理器(Window Manager)這兩個系統服務所監視。當用戶觸發了輸入事件(如鍵盤輸入,點擊按鈕等),如果應用5秒內沒有響應用戶的輸入事件,那么,Android會認為該應用無響應,便彈出ANR對話框。而彈出ANR異常,也主要是為了提升用戶體驗。

解決方案是對于耗時的操作,比如訪問網絡、訪問數據庫等操作,需要開辟子線程,在子線程處理耗時的操作,主線程主要實現UI的操作

6.HTTPS中SSL證書認證的過程

7.簡述Android的Activity的內部機制

8.對Android Framework層的某一個模塊(或者System App)做簡要介紹

9.Android Handler的機制和原理

主線程使用Handler的過程

首先在主線程創建一個Handler對象 ,并重寫handleMessage()方法。然后當在子線程中需要進行更新UI的操作,我們就創建一個Message對象,并通過handler發送這條消息出去。之后這條消息被加入到MessageQueue隊列中等待被處理,通過Looper對象會一直嘗試從Message Queue中取出待處理的消息,最后分發會Handler的handler Message()方法中。

參考 blog.csdn.net/u012827296/…

10.線程間通信和進程間通信有什么不同,Android開發過程中是怎么實現的

www.cnblogs.com/yangtao1995…

11.簡述項目中對于內存優化的幾個細節點

答案:

  1. 當查詢完數據庫之后,及時關閉Cursor對象。
  2. 記得在Activity的onPause方法中調用unregisterReceiver()方法,反注冊廣播
  3. 避免Content內存泄漏,比如在4.0.1之前的版本上不要講Drawer對象置為static。當一個Drawable綁定到了View上,實際上這個View對象就會成為這個Drawable的一個callback成員變量,上面的例子中靜態的sBackground持有TextView對象lable的引用,而lable只有Activity的引用,而Activity會持有其他
贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
久久av喷吹av高潮av| 韩日视频在线观看| eeuss中文| 色综合av综合无码综合网站| 国产美女视频免费看| 国产特级黄色大片| 黄色一级片黄色| 国产福利在线免费| 不卡影院一区二区| 怡红院av亚洲一区二区三区h| 青草网在线观看| 一道本在线免费视频| 欧美亚洲黄色片| 欧美午夜性生活| 中国黄色录像片| 一区二区三区网址| 欧美极品少妇无套实战| 奇米777四色影视在线看| 五十路熟女丰满大屁股| 在线视频观看91| 久久成年人网站| av无码久久久久久不卡网站| 久久av秘一区二区三区| 国产wwwxx| 一区二区三区韩国| 免费在线观看毛片网站| 日本一本二本在线观看| 一二三在线视频| 亚洲这里只有精品| 成年人网站大全| 免费欧美一级视频| 日本中文字幕片| 日本成人黄色网| 99精品一级欧美片免费播放| 亚洲国产日韩欧美在线观看| 狠狠精品干练久久久无码中文字幕| 一级片免费在线观看视频| 欧美日韩二三区| 女性隐私黄www网站视频| 色撸撸在线观看| 国产精品乱码久久久久| 欧美精品第三页| 欧美一级特黄aaa| 一区二区三区 欧美| 制服丝袜综合网| 日韩欧美中文在线视频| 黄色三级中文字幕| 日本在线视频www| av中文字幕网址| 久久av综合网| 韩国视频一区二区三区| 亚洲综合激情五月| 拔插拔插海外华人免费| 国产乱淫av片杨贵妃| 91制片厂毛片| 日韩精品久久一区二区| 亚洲欧美久久久久| 亚洲国产精品久久久久爰色欲| 校园春色 亚洲色图| 五月婷婷丁香色| 97在线播放视频| 黄色特一级视频| 天堂一区在线观看| 可以免费看的黄色网址| 在线播放免费视频| 波多野结衣天堂| 欧美午夜精品理论片| www.av片| 超碰97在线看| 日本中文字幕二区| 国产亚洲天堂网| 欧美乱做爰xxxⅹ久久久| 尤物国产在线观看| av免费在线播放网站| 男人天堂手机在线视频| 咪咪色在线视频| 日本黄色福利视频| 亚洲成色www.777999| 1024精品视频| a级黄色一级片| 欧美中文字幕在线观看视频| 九九热精品国产| 亚洲综合色在线观看| 免费黄色福利视频| 久久综合色视频| 搞av.com| 久久久久久久久久网| 日本免费成人网| 成人av在线播放观看| 99热这里只有精品免费| 99久热在线精品视频| 熟妇熟女乱妇乱女网站| 在线视频一二三区| 真人做人试看60分钟免费| 日本一区二区免费高清视频| 精品久久免费观看| 自拍偷拍视频在线| 中文字幕精品在线播放| 国产在线无码精品| 国产精品裸体瑜伽视频| heyzo亚洲| 人妻内射一区二区在线视频| 激情视频综合网| www.天天射.com| 激情久久综合网| 国产91porn| www.av中文字幕| 成年人午夜免费视频| 无码人妻丰满熟妇区五十路百度| a√天堂在线观看| 在线免费av播放| 黄色www在线观看| 精品视频在线观看一区| 中国丰满人妻videoshd| 三级a在线观看| 干日本少妇视频| 国产l精品国产亚洲区久久| www.激情小说.com| 少妇高潮大叫好爽喷水| 中文字幕日本最新乱码视频| 91 在线视频观看| 成人免费看片视频在线观看| koreanbj精品视频一区| 夜夜夜夜夜夜操| 丝袜人妻一区二区三区| 伊人色在线观看| 亚洲熟妇无码另类久久久| 欧美三级午夜理伦三级| 亚洲欧美国产中文| 中文字幕在线乱| 一本色道无码道dvd在线观看| 亚洲美免无码中文字幕在线 | www婷婷av久久久影片| 天堂av8在线| 美女扒开大腿让男人桶| 色91精品久久久久久久久| 极品粉嫩国产18尤物| 亚洲无在线观看| 久草综合在线观看| 国产91在线免费| 国产精品视频网站在线观看| 男女污污的视频| 成人免费观看cn| 亚洲性生活网站| 青青青在线播放| www.99r| 国产一级爱c视频| 亚洲热在线视频| 91国在线高清视频| 日韩黄色片在线| 国产精品igao激情视频| 国产成人精品视频免费看| 欧美与动交zoz0z| 色婷婷777777仙踪林| 色七七在线观看| 无码日本精品xxxxxxxxx| 黄页网站大全在线观看| 日本午夜激情视频| 成人免费在线观看视频网站| 一女被多男玩喷潮视频| 国产视频在线观看网站| 色撸撸在线观看| 在线观看中文av| 日韩高清第一页| 女人高潮一级片| 91丨九色丨蝌蚪| 激情文学亚洲色图| 自拍一级黄色片| 青青视频免费在线| 日韩专区第三页| 污污视频网站免费观看| 50度灰在线观看| 成人一级片网站| 中文字幕丰满乱码| 东北少妇不带套对白| 国产免费成人在线| 日韩黄色片在线| 婷婷激情小说网| 国产美女无遮挡网站| 妺妺窝人体色www在线小说| 国产经典久久久| 青青草国产免费| 精品少妇人妻av免费久久洗澡| 无码内射中文字幕岛国片| 人妻熟女一二三区夜夜爱| 少妇高清精品毛片在线视频| 亚欧在线免费观看| 男生操女生视频在线观看| 欧美日韩dvd| 日韩欧美在线播放视频| 日本激情综合网| 2022中文字幕| 任你操这里只有精品| www.久久com| 91免费视频网站在线观看| 成人日韩在线视频| www.九色.com| 福利片一区二区三区| 欧美日本视频在线观看| 国产又粗又长又大的视频|