無標題文章

--如何處理android多線程安全
不要堵塞UI線程,不在主線程中做耗時操作的處理,可以開啟子線程去執行耗時操作

--如何對性能優化,從哪幾個方面進行
1、布局優化
使用relativelayout替代linearlayout減少布局的層級
通過include標簽對布局進行復用,一般配合merge標簽使用(merge標簽可以去重)
使用viewstub標簽實現按需加載布局文件

2、內存優化
bitmap優化 ,大量的圖片會造成內存占用過高 ,可能會導致OOM問題,可以對圖片進行緩存處理和適當的進行圖片壓縮顯示

避免寫出內存泄露的代碼,如靜態變量導致的內存泄露 (被聲明的靜態的變量引用了該activity,因此無法正常銷毀)、單例模式導致的內存泄露(activity被單例模式所持有,因此activity的對象無法被即使釋放)
小技巧:
對常量使用static修飾符、盡量使用視圖緩存、使用靜態方法、減少不必要的對象、盡量不要使用枚舉、避免使用IOC框架

還可以通過一些分析工具,比如MAT來找出潛在的內存泄露的地方從而解決

3、響應速度優化
避免在主線程中做耗時操作,將耗時操作放到子線程中去執行

4、線程優化
使用線程池,它可以重用內部的線程,從而避免了線程的創建和銷毀所帶來的性能開銷,
同時它還能有效的控制線程池的最大并發數,避免大量的線程因搶占系統資源,從而導致的阻塞現象的發生

--handler的機制原理
andriod提供了 Handler 和 Looper 來滿足線程間的通信。Handler 先進先出原則。Looper類用來管理特定線程內對象之間的消息交換(Message Exchange)。
1)Looper: 一個線程可以產生一個Looper對象,由它來管理此線程里的Message Queue(消息隊列)。2)Handler: 你可以構造Handler對象來與Looper溝通,以便push新消息到Message Queue里;或者接收Looper從Message Queue取出)所送來的消息。

  1. Message Queue(消息隊列):用來存放線程放入的消息。
    4)線程:UI thread 通常就是main thread,而Android啟動程序時會替它建立一個Message Queue。

---pulltorefresh原理分析
http://blog.csdn.net/birdsaction/article/details/44831737

--android-Ultra-Pull-To-Refresh 源碼解析
http://a.codekk.com/detail/Android/Grumoon/android-Ultra-Pull-To-Refresh%20源碼解析

--volley源碼解析
http://a.codekk.com/detail/Android/grumoon/Volley%20源碼解析

--Android網絡請求中頁面關閉了應該怎么處理
解決方案:http://www.zhihu.com/question/38837116/answer/78745708
http://blog.csdn.net/carlos1992/article/details/50420335

ctivity里面啟動了網絡請求,而在這個網絡請求還沒返回結果的時候,Activity被結束了,此時如果繼續使用其中的Context等,除了無辜的浪費CPU,電池,網絡等資源,有可能還會導致程序crash,所以,我們需要處理這種一場情況。。

說白了,這個問題的關鍵是在網絡線程請求還未返回時,用戶結束了這個網絡線程的上下文activity后,如何禁止此時網絡返回調用刷新UI的網絡回調的問題。以下是解決辦法:1.如果是通過AsyncTask<>進行的網絡請求,那么,你一般是在onPostExecute()方法中進行回調接口的調用。如果是這樣的話,只需要使用AsyncTask自帶的cancel()方法就可以了,這個方法的調用就放在上下文activity的onStop()方法內。這個方法調用后,會使調用該方法的Asynctask對象isCanceld()方法返回true,且在doInBackground后不調用onPostExecute()而去調用onCancel()方法。剩下的就不用細說了,如果有不懂得話,歡迎提問。2.如果沒有使用AsyncTask,而是自己開辟線程,自己是用HttpURLConnection實現,那么解決辦法是仿照Google自己的網絡請求框架Volley,給網絡請求類加一個標志位flag,當activity結束的時候置位。而你自己的網絡請求類在網絡請求結束后調用網絡回調的時候對這個標志位進行判定。這樣就可以解決以上問題了。

----tcp/ip和http了解多少 ,socket呢 ,以及他們之間的關系
tcp屬于傳輸層 ,ip屬于網絡層 ,而http屬于應用層 (http,即超文本傳輸協議 )
tcp/ip負責對數據的傳遞,http則用于將傳遞的數據識別顯示到網頁中
socket也是用于通信,實際上它是對tcp/ip的一個封裝,提供給了外部一個通信接口

--socket通信使用流程
建立一個Socket對象 ,設置IP和端口 ,然后獲取其I/O流

---如何在Activity之間傳遞Handler

我的做法是在一個公共類中定義一個public static handler對象.跳轉時將這個第一個活動的handler句柄交給公共類,進入第二個界面后再從公共類中取出來用.

---android 用handler怎么把消息發送到指定的activity
思路:
1、建立一個繼承Application的子類,定義handle屬性并創建get和set方法
2、在主activity中為handler賦值
3、在另一個activity通過Application的子類獲取handler進行傳值

http://zhidao.baidu.com/question/321829050.html?qbl=relate_question_1&word=%D4%DAactivity%C8%E7%BA%CE%D7%F6handler%B3%F5%CA%BC%BB%AF%B2%D9%D7%F7

1.在MyAPP中定義屬性handlerpackage jason.com;import jason.com.MasterActivity.MyHandler;import android.app.Application;/*** 自己實現Application,實現數據共享* @author jason*/public class MyAPP extends Application {// 共享變量private MyHandler handler = null;// set方法public void setHandler(MyHandler handler) {this.handler = handler;}// get方法public MyHandler getHandler() {return handler;}}2、在主activity 中給MyAPP的屬性handler賦值@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);mAPP = (MyAPP) getApplication();handler = new MyHandler();tv = (TextView) findViewById(R.id.tv);btn_to = (Button) findViewById(R.id.btn_to);// 設置監聽器btn_to.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// 設置共享變量mAPP.setHandler(handler);// 啟動另一個ActivityIntent intent = new Intent(MasterActivity.this,ToChangeViewActivity.class);startActivity(intent);}});}3、在另一個activity中獲取MyAPP中handler進行傳值protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.show);mAPP = (MyAPP) getApplication();// 獲得該共享變量實例mHandler = mAPP.getHandler();findViewById(R.id.btn_chang).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// 發送消息mHandler.sendEmptyMessage(CHANGED);ToChangeViewActivity.this.finish();}});}


---事件分發機制
http://www.tuicool.com/articles/Mra6vmn

dispatchTouchEvent方法用于事件的分發,Android中所有的事件都必須經過這個方法的分發,然后決定是自身消費當前事件還是繼續往下分發給子控件處理。
返回true表示不繼續分發,事件沒有被消費。返回false則繼續往下分發,如果是ViewGroup則分發給onInterceptTouchEvent進行判斷是否攔截該事件。

onTouchEvent方法用于事件的處理,返回true表示消費處理當前事件,返回false則不處理,交給子控件進行繼續分發。

onInterceptTouchEvent是ViewGroup中才有的方法,View中沒有,它的作用是負責事件的攔截
,返回true的時候表示攔截當前事件,不繼續往下分發,交給自身的onTouchEvent進行處理。返回false則不攔截,繼續往下傳。這是ViewGroup特有的方法,因為ViewGroup中可能還有子View,而在Android中View中是不能再包含子View的(iOS可以)。

---多線程并發行及解決方式
同一個程序有多個線程在同一時間段同時處理
以下典型的單例模式的寫法,不是線程安全的 ,在多線程的環境,可能會產生一個以上的實例對象
class Singleton { 2privatestatic Singleton obj; 3 4private Singleton() { 5 } 6 7publicstatic Singleton getInstance() { 8if (obj == null) 9 obj = new Singleton();10return obj;11 }12 }
之所以會出現我們不希望的情況 是因為在第一個線程在判斷了if(obj==null)之后 準備去構造對象(但是還沒有構造)的時候、第二個線程調用了方法、并判斷obj是否等于null、此時因為第一個線程還沒有構造對象、所以第二個線程也進入了if語句塊內、因此 出現了可能會構造兩個不同的對象
解決方式 :
在JDK1.5之前(不包括1.5)synchronized關鍵字來保證例子中單例模式的正確性、即這樣定義單例模式
class Singleton { 2privatestatic Singleton obj; 3 4private Singleton() { 5 } 6 7publicsynchronizedstatic Singleton getInstance() { 8if (obj == null) 9 obj = new Singleton();10return obj;11 }12 }

---tcp和udp的區別

TCP是面向連接的,雖然說網絡的不安全不穩定特性決定了多少次握手都不能保證連接的可靠性,但TCP的三次握手在最低限度上(實際上也很大程度上保證了)保證了連接的可靠性;
  而UDP不是面向連接的,UDP傳送數據前并不與對方建立連接,對接收到的數據也不發送確認信號,發送端不知道數據是否會正確接收,當然也不用重發,所以說UDP是無連接的、不可靠的一種數據傳輸協議。
簡單的說就是:tcp是面向連接的,安全性高,速度較慢 ;udp不是面向連接的 ,安全性較低 ,但速度快

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,349評論 25 708
  • 1.要做一個盡可能流暢的ListView,你平時在工作中如何進行優化的? ①Item布局,層級越少越好,使用hie...
    fozero閱讀 757評論 0 0
  • p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo...
    admxjx閱讀 1,164評論 0 0
  • 這兩天自己有點小郁悶。理由如下圖,額,開玩笑……如下文: 1 自己初步了解各類編程語言后,果斷選擇了學習pytho...
    Firewinter閱讀 153評論 1 2