Android學習之——雜項

new關鍵字和newInstance()方法的區別

a. new可以調用帶參數的構造函數,newInstance不可以
b. newInstance: 弱類型。低效率。隻能調用無參構造。

new: 強類型。相對高效。能調用任何public構造。

c. new是自己下廚,做飯自己吃。newInstance是外面吃別人做給你吃。

自己做可以保證安全,而且可以有多個口味,什麼醬,放多少自己定。new對象不會因為找不到類而出異常,而且你還可以調用多個構造函數,按照自己口味去new對象,去做一份符合自己口味的。

在外面吃,可能會你點的菜那個店裡沒有,或者是口味不對,你要吃番茄醬,但是人傢隻有花生醬。而且菜沒洗幹凈你也不知道。newInstance也是如此,很可能你要的對象他不存在,或者是參數不對。

對象的串行化(Serialization)
什麼是串行化:
把對象的這種能記錄自己的狀態以便將來再生的能力,叫做對象的持續性(persistence)。
對象通過寫出描述自己狀態的數值來記錄自己,這個過程叫對象的串行化(Serialization)。
串行化的任務:寫出對象實例變量的數值。
https://www.cnblogs.com/vicenteforever/articles/1471775.html

SoapObject.getProperty的作用:

// 生成調用Webservice方法的SOAP請求信息.該信息由SoapSerializationEnvelope對象描述
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
        SoapEnvelope.VER11);
envelope.bodyOut = rpc;
envelope.dotNet = true;
envelope.setOutputSoapObject(rpc);
 
ht.call(NAMESPACE + methodName, envelope);
if (envelope.bodyIn.toString().startsWith("SoapFault")) {
    SoapFault sf = (SoapFault) (envelope.bodyIn);
    Log.i("fault", sf.faultstring);
    if (handler != null) {
        Message message = Message.obtain(handler);
        message.what = 3;
        message.obj = sf.faultstring;
        message.sendToTarget();
    }
    return;
}
SoapObject result = (SoapObject)envelope.bodyIn;
String str = result.getProperty("abc").toString();//從result裡面找到名為"abc"的值  如:result的值為:getInfoResponse{abc=測試; } 那麼,result.getProperty("abc")將會從result裡面找到abc的值“測試”

Android 的Message機制:
Message機制涉及三個主要的類:Handler、 Message、 Looper
1. Handler 兩個用途:定時處理或者分發消息;添加一個執行的行為在其他線程中執行。
Handler中常見的方法就是對消息的處理,可以覆蓋public void handleMessage(Message msg) 方法,

2. 消息android.os.Message
定義一個Message包含必要的描述和屬性數據,此對象可以被發送給android.os.Handler處理。
字段:what保存消息標示;obj是Object類型對象;replyTo是消息管理器,會關聯到一個handler,handler就是處理其中的消息。通常Message對象不是new出來的,而是調用handler中的obtainMessage方法來直接獲得Message對象
如:

Message message = Message.obtain(handler);

3. Looper類主要用於一個線程循環獲取消息隊列中的消息:管理消息隊列,負責消息的出列和入列操作。

Message機制原理示意圖:

Activity EHandler Looper MessageQueue

IntentReceiver EHandler Looper MessageQueue

具體詳細傳遞步驟等可以參考 https://blog.csdn.net/dadoneo/article/details/7667726 文章

WeakReference
WeakReference與SoftReference都可以用來保存對象的實例引用,與垃圾回收有關。
WeakReference是弱引用,保存的對象實例可被GC回收,常用於 在某處保存對象引用,而又不幹擾該對象被GC回收 如Debug,內存監視工具等程序中。該類程序一般要求既要觀察到對象,又不能影響該對象正常的GC過程。
SoftReference是強引用,保存對象實例,除非JVM即將OutOfMemory,否則不會被GC回收。特別適用於設計對象Cache。對於Cache,我們希望被緩存的對象最好始終常駐內存,但是如果JVM內存吃緊,為瞭不發生OutOfMemoryError導致系統崩潰,必要的時候也允許JVM回收Cache的內存。待合適的時機再把數據重新Load到Cache中。使得設計更具有彈性。

Dialog點擊按鈕時對話框不會被關閉的實現:

public void closeDialog(final DialogInterface dialog, boolean close) {
    // 利用反射使點擊按鈕時,對話框不會關閉
    try {
        // 得到AlertDialog的父類屬性mShowing
        field = dialog.getClass().getSuperclass()
                .getDeclaredField("mShowing");
        field.setAccessible(true);
        // 將mShowing變量設為false,表示對話框已關閉
        field.set(dialog, close);
        dialog.dismiss();
    } catch (NoSuchFieldException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

詳細的反射可以參照這篇文章
android 反射機制的原理與實現 https://blog.csdn.net/annaleeya/article/details/8240510

Mr.傅:學習筆記

歡迎轉載,轉載註明出處,謝謝

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *