咖啡伴侶

          呆在上海
          posts - 163, comments - 156, trackbacks - 0, articles - 2

          如果兩個(gè)對(duì)象equal,那么它們的hashCode值一定要相同;2、如果兩個(gè)對(duì)象的hashCode相同,它們并不一定equal

          當(dāng)Set要添加新的元素時(shí),先調(diào)用這個(gè)元素的hashCode方法,就一下子能定位到它應(yīng)該放置的物理位置上。如果這個(gè)位置上沒(méi)有元素,它就可以直接存儲(chǔ)在 這個(gè)位置上,不用再進(jìn)行任何比較了;如果這個(gè)位置上已經(jīng)有元素了,就調(diào)用它的equals方法與新元素進(jìn)行比較,相同的話就不存了,不相同就散列其它的地址。

          所以兩個(gè)不equal的對(duì)象,有相同的hash,是可以存進(jìn)Set的。

          class HashNode {
              int id;
             
              public HashNode(int id){
                  this.id = id;
              }
             
              public int hashCode() {
                  return id;
              }
             
              public boolean equals(Object obj) {
                  return false;
              }
          }

          public class HashTest {

              public static void main(String[] args) {
                  HashNode n1 = new HashNode(1);
                  HashNode n2 = new HashNode(1);
                 
                  HashMap map = new HashMap();
                  map.put(n1, "111");
                  map.put(n2, "222");
                 
                  System.out.println(n1.equals(n2));
                  System.out.println(n1.hashCode() == n2.hashCode());
                  System.out.println(map.keySet().size());
              }

          }

          posted @ 2010-03-03 16:03 oathleo 閱讀(1694) | 評(píng)論 (4)編輯 收藏

          很長(zhǎng)一段時(shí)間,對(duì)MVC和MVP區(qū)別很是模糊。
          一直忙碌于客戶不停的需求中,忽略了產(chǎn)品本身上這些最重要的東西。
          現(xiàn)在即將待業(yè),放下自己為之工作近三年的產(chǎn)品,真的感覺(jué)猶如失去自己的孩子。
          好的一方面是空閑的時(shí)間多了,終于可以想想這些事情了。

          MVC算是個(gè)被人說(shuō)爛掉的東西了,MVP也屢屢被人提及。
          最大的區(qū)別在哪里呢?為什么要再演變個(gè)MVP出來(lái)呢?

          就定義上來(lái)說(shuō)最大的區(qū)別在于C和P,就構(gòu)架上來(lái)說(shuō),是View層實(shí)現(xiàn)的方式不同。
          MVC:View層肩負(fù)很大任務(wù),View關(guān)聯(lián)Model,View的渲染是直接通過(guò)Model層的數(shù)據(jù)來(lái)確定的。還是有很多業(yè)務(wù)邏輯在View上完成。
          MVP:View層的任務(wù)大大縮減,View不再知道Model,P層完成上面提到的View層完成的業(yè)務(wù)邏輯。
          總之一句話MVP里,View層絕對(duì)不能再訪問(wèn)Model了,

          任何一種設(shè)計(jì)模式的出現(xiàn)絕對(duì)不是為了出現(xiàn)而出現(xiàn)的。總是為了解決現(xiàn)實(shí)中存在的某些老的模式無(wú)法或難以解決的問(wèn)題才出現(xiàn)的。

          為什么會(huì)出現(xiàn)MVP呢?
          看看客戶拿到一個(gè)設(shè)計(jì)精良的MVC的產(chǎn)品,做二次開(kāi)發(fā)的時(shí)候,如果他項(xiàng)目足夠大,肯定會(huì)發(fā)現(xiàn)MVC的好處。任務(wù)集中在Model層,設(shè)計(jì)好Model層數(shù)據(jù)的填充,簡(jiǎn)單的實(shí)現(xiàn)就完成了。MVC的架構(gòu)幫他解決了很多問(wèn)題,大家很Happy!
          當(dāng)然客戶的需求總是永無(wú)止境的,當(dāng)簡(jiǎn)單需求被滿足的時(shí)候,他又會(huì)往高層次發(fā)展,也許他就完全需要不同的View來(lái)做同樣的Model的展示(比如一個(gè)在JSP,一個(gè)在Swing或者Android上),在這個(gè)時(shí)候,稍微想下,他就發(fā)現(xiàn)他要做的任務(wù)開(kāi)始變的很大了。Model層的數(shù)據(jù)縱使可以共享,事件控制(轉(zhuǎn)發(fā))也能,而View層無(wú)論如何是逃不了了。于是Web程序員硬著頭皮也要學(xué)Swing,Swing的程序員郁悶的學(xué)JSP。
          試想這個(gè)時(shí)候如果有個(gè)人,能把陷在View上的上萬(wàn)行code,拉到一個(gè)即能聯(lián)系到Model,又能聯(lián)系到View的層次上,那真的要感謝蒼天大地了。

          MVP我想應(yīng)該就是在這個(gè)時(shí)候出現(xiàn)的。它處理所有View和Model之間的消息傳遞,數(shù)據(jù)更新,交互操作。比如從Swing的TextField里輸入個(gè)字段信息,和從JSP里的Form里輸入這個(gè)字段信息,處理的流程應(yīng)該是可以共享這段代碼的。當(dāng)然這個(gè)時(shí)候,為了解決不同View上的一些特殊情況,可以使用適配器模式,來(lái)處理多個(gè)View的程序設(shè)計(jì)問(wèn)題。

          設(shè)計(jì)模式?jīng)]有好壞之分,只有合不合適。你的產(chǎn)品如果只需要輸入個(gè)A返回個(gè)B,沒(méi)有平臺(tái)建議,沒(méi)有系統(tǒng)升級(jí),那就忘了所有的設(shè)計(jì)模式,走那條最快實(shí)現(xiàn)的路吧。

          posted @ 2010-02-28 15:38 oathleo 閱讀(2858) | 評(píng)論 (6)編輯 收藏




          posted @ 2010-02-22 18:03 oathleo 閱讀(1515) | 評(píng)論 (4)編輯 收藏

          Android線程安全問(wèn)題:

                button2.setOnClickListener(new OnClickListener() {
                     ......
               });
          加了個(gè)監(jiān)聽(tīng),里面起Timer,定時(shí)修改數(shù)據(jù)。
          發(fā)現(xiàn)Log一直在打,View無(wú)變化。
          估計(jì)線程出了問(wèn)題。類(lèi)似Swing的線程安全問(wèn)題。
          接著Google.....


          The best thing is to  use Handler with delayed messages.
          And Timer works fine, the problem is that a Timer runs in a separate thread,   and so you are trying to modify a view owned by another thread (the main   thread that originally created it).

          What I think is happening is you're falling off the UI thread. There is a single "looper" thread which handles all screen updates. If you attempt to call "invalidate()" and you're not on this thread nothing will happen.

          Try using "postInvalidate()" on your view instead. It'll let you update a view when you're not in the current UI thread.


          解決辦法和我預(yù)計(jì)的一樣:

          1.在Invalidate處調(diào)用 postInvalidate,命名上可以參數(shù)肯定是把當(dāng)前的timer線程排隊(duì)到UI線程去。不過(guò)對(duì)于我不是很適用,畢竟UI不希望讓用戶自己去Invalidate

          2.既然不能去排隊(duì),那就干脆把自己改造成UI線程吧。借助android.os.Handler

                    final Handler handler = new Handler();
                          Timer timer = new Timer();
                          timer.schedule(new TimerTask() {
                              public void run() {
                                  handler.post(new Runnable() {
                                      public void run() {
                                           root.setName(new Date() + "Root+" );//不一定是顯式的調(diào)用修改UI的語(yǔ)句
                                      }
                                  });
                              }
                          },1000,3000);   


          OK!


           

          posted @ 2010-02-04 18:18 oathleo 閱讀(279) | 評(píng)論 (0)編輯 收藏

          1.AWT完全干掉了,看來(lái)又要學(xué)一遍Android的2D
          2.Layout變成一個(gè)很爽的東西,類(lèi)似Swing里JPanel+ Layout的混合體,多好的創(chuàng)意!!當(dāng)然嵌套啥的是必定支持了
          3.java.beans包還存在,又省事不少。
          4.sdk還打了一些常用公司包
             包括apache json w3cdom xml.sax等





          posted @ 2010-01-19 18:24 oathleo 閱讀(190) | 評(píng)論 (0)編輯 收藏

               摘要:   閱讀全文

          posted @ 2010-01-18 18:17 oathleo 閱讀(236) | 評(píng)論 (0)編輯 收藏

          1.BitMap to 數(shù)組
                  int w = bitmapSrc.getWidth();
                  int h = bitmapSrc.getHeight();
                 
                  int[] pixels = new int[w * h];
                  bitmapSrc.getPixels(pixels, 0, w, 0, 0, w, h);

          2.RGB HSV互轉(zhuǎn)問(wèn)題
          android.graphics.Color 修復(fù)了java.awt.Color 的bug
          RGBToHSV HSVToColor

          3.Config
                 Bitmap bitmap = Bitmap.createBitmap(w, h, Config.ARGB_8888);//Config.ARGB_8888,Config.ARGB_4444透明效果


          Color 成了int,一下子感覺(jué)世界變得簡(jiǎn)單了。

          4.文字的顯示長(zhǎng)度
                      Rect textBound = new Rect();
                      paint.getTextBounds(name, 0, name.length(), textBound);

          5.文字渲染 x起始點(diǎn)在左下角
                 canvas.drawText(name, x, y, paint);


          posted @ 2010-01-14 16:32 oathleo 閱讀(337) | 評(píng)論 (0)編輯 收藏

               摘要:   閱讀全文

          posted @ 2010-01-13 18:29 oathleo 閱讀(279) | 評(píng)論 (0)編輯 收藏

          1.eclipse 3.5(3.2不支持)
          2.模擬器插件
          3.Android SDK1.5

          3.源代碼引入:
          ADT是從SDK目錄下的“sources” 目錄來(lái)查找class對(duì)應(yīng)的源代碼,這樣我們只要把源代碼放到sources目錄中ADT就可以自動(dòng)找到對(duì)應(yīng)的源代碼了。

           http://www.digginmobile.com/android.asp ,這里有android1.5的源代碼,下載源代碼后,

          在\android-sdk-windows-1.5_r2\platforms\android-1.5下新建一個(gè)sources目錄,

          將源文件放在sources目錄下,然后在編寫(xiě)的android的class中就可以看到引用文件的源代碼了。

          4.不需要每次重啟模擬器,直接再跑程序,ADT會(huì)自動(dòng)用當(dāng)前的模擬器啟動(dòng)程序。否則重啟模擬器本機(jī)需要60s以上




          posted @ 2010-01-12 17:49 oathleo 閱讀(247) | 評(píng)論 (0)編輯 收藏

               摘要: TWaver3.3 Blink Link Flowing Demo

          1.節(jié)點(diǎn)告警閃爍,附件的閃爍 增加了IE下 獨(dú)立的閃爍周期
          2.Link連線的流動(dòng)效果 也增加了IE下 獨(dú)立的流動(dòng)周期  閱讀全文

          posted @ 2009-11-30 16:05 oathleo 閱讀(1475) | 評(píng)論 (2)編輯 收藏

          僅列出標(biāo)題
          共17頁(yè): First 上一頁(yè) 8 9 10 11 12 13 14 15 16 下一頁(yè) Last 
          主站蜘蛛池模板: 丽江市| 泰兴市| 象州县| 沂水县| 白城市| 若羌县| 新化县| 永德县| 宜兰市| 井陉县| 罗山县| 余庆县| 巴楚县| 美姑县| 那曲县| 曲靖市| 靖州| 永清县| 贵南县| 五峰| 保靖县| 邹城市| 北流市| 桦甸市| 岗巴县| 淄博市| 南投市| 博爱县| 东乡族自治县| 南安市| 井研县| 开原市| 唐河县| 东兴市| 广河县| 鹿泉市| 读书| 桐乡市| 南汇区| 西乌珠穆沁旗| 阳东县|