MDA/MDD/TDD/DDD/DDDDDDD
          posts - 536, comments - 111, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          2015年3月2日

          System.out.println("availableLocales :"+  Locale.getAvailableLocales().length);

          Locale[] arr=Locale.getAvailableLocales();
          Arrays.sort(arr, new Comparator<Locale>() {
          @Override
          public int compare(Locale o1, Locale o2) {
          return o1.getLanguage().compareTo(o2.getLanguage());
          }
          });

          for(Locale l:arr){
          System.out.println("語言:"+ l.getLanguage()+" 名稱:"+l.getDisplayLanguage()
          +(StringUtils.isEmpty(l.getDisplayCountry())?"":(" 國家:"+ l.getDisplayCountry())) + " "+l.toString());
          }
          輸出如下
          availableLocales :160
          語言: 名稱:
          語言:ar 名稱:阿拉伯文 國家:阿拉伯聯合酋長國 ar_AE
          語言:ar 名稱:阿拉伯文 國家:約旦 ar_JO
          語言:ar 名稱:阿拉伯文 國家:敘利亞 ar_SY
          語言:ar 名稱:阿拉伯文 國家:巴林 ar_BH
          語言:ar 名稱:阿拉伯文 國家:沙特阿拉伯 ar_SA
          語言:ar 名稱:阿拉伯文 國家:也門 ar_YE
          語言:ar 名稱:阿拉伯文 國家:埃及 ar_EG
          語言:ar 名稱:阿拉伯文 國家:蘇丹 ar_SD
          語言:ar 名稱:阿拉伯文 國家:突尼斯 ar_TN
          語言:ar 名稱:阿拉伯文 國家:伊拉克 ar_IQ
          語言:ar 名稱:阿拉伯文 國家:摩洛哥 ar_MA
          語言:ar 名稱:阿拉伯文 國家:卡塔爾 ar_QA
          語言:ar 名稱:阿拉伯文 國家:阿曼 ar_OM
          語言:ar 名稱:阿拉伯文 ar
          語言:ar 名稱:阿拉伯文 國家:科威特 ar_KW
          語言:ar 名稱:阿拉伯文 國家:利比亞 ar_LY
          語言:ar 名稱:阿拉伯文 國家:阿爾及利亞 ar_DZ
          語言:ar 名稱:阿拉伯文 國家:黎巴嫩 ar_LB
          語言:be 名稱:白俄羅斯文 be
          語言:be 名稱:白俄羅斯文 國家:白俄羅斯 be_BY
          語言:bg 名稱:保加利亞文 bg
          語言:bg 名稱:保加利亞文 國家:保加利亞 bg_BG
          語言:ca 名稱:加泰羅尼亞文 國家:西班牙 ca_ES
          語言:ca 名稱:加泰羅尼亞文 ca
          語言:cs 名稱:捷克文 cs
          語言:cs 名稱:捷克文 國家:捷克共和國 cs_CZ
          語言:da 名稱:丹麥文 國家:丹麥 da_DK
          語言:da 名稱:丹麥文 da
          語言:de 名稱:德文 de
          語言:de 名稱:德文 國家:瑞士 de_CH
          語言:de 名稱:德文 國家:奧地利 de_AT
          語言:de 名稱:德文 國家:盧森堡 de_LU
          語言:de 名稱:德文 國家:德國 de_DE
          語言:de 名稱:德文 國家:希臘 de_GR
          語言:el 名稱:希臘文 el
          語言:el 名稱:希臘文 國家:塞浦路斯 el_CY
          語言:el 名稱:希臘文 國家:希臘 el_GR
          語言:en 名稱:英文 國家:美國 en_US
          語言:en 名稱:英文 國家:新加坡 en_SG
          語言:en 名稱:英文 國家:馬耳他 en_MT
          語言:en 名稱:英文 en
          語言:en 名稱:英文 國家:菲律賓 en_PH
          語言:en 名稱:英文 國家:新西蘭 en_NZ
          語言:en 名稱:英文 國家:南非 en_ZA
          語言:en 名稱:英文 國家:澳大利亞 en_AU
          語言:en 名稱:英文 國家:愛爾蘭 en_IE
          語言:en 名稱:英文 國家:加拿大 en_CA
          語言:en 名稱:英文 國家:印度 en_IN
          語言:en 名稱:英文 國家:英國 en_GB
          語言:es 名稱:西班牙文 國家:巴拿馬 es_PA
          語言:es 名稱:西班牙文 國家:委內瑞拉 es_VE
          語言:es 名稱:西班牙文 國家:波多黎哥 es_PR
          語言:es 名稱:西班牙文 國家:玻利維亞 es_BO
          語言:es 名稱:西班牙文 國家:阿根廷 es_AR
          語言:es 名稱:西班牙文 國家:薩爾瓦多 es_SV
          語言:es 名稱:西班牙文 es
          語言:es 名稱:西班牙文 國家:西班牙 es_ES
          語言:es 名稱:西班牙文 國家:哥倫比亞 es_CO
          語言:es 名稱:西班牙文 國家:巴拉圭 es_PY
          語言:es 名稱:西班牙文 國家:厄瓜多爾 es_EC
          語言:es 名稱:西班牙文 國家:美國 es_US
          語言:es 名稱:西班牙文 國家:危地馬拉 es_GT
          語言:es 名稱:西班牙文 國家:墨西哥 es_MX
          語言:es 名稱:西班牙文 國家:洪都拉斯 es_HN
          語言:es 名稱:西班牙文 國家:智利 es_CL
          語言:es 名稱:西班牙文 國家:多米尼加共和國 es_DO
          語言:es 名稱:西班牙文 國家:古巴 es_CU
          語言:es 名稱:西班牙文 國家:烏拉圭 es_UY
          語言:es 名稱:西班牙文 國家:哥斯達黎加 es_CR
          語言:es 名稱:西班牙文 國家:尼加拉瓜 es_NI
          語言:es 名稱:西班牙文 國家:秘魯 es_PE
          語言:et 名稱:愛沙尼亞文 et
          語言:et 名稱:愛沙尼亞文 國家:愛沙尼亞 et_EE
          語言:fi 名稱:芬蘭文 國家:芬蘭 fi_FI
          語言:fi 名稱:芬蘭文 fi
          語言:fr 名稱:法文 國家:比利時 fr_BE
          語言:fr 名稱:法文 國家:瑞士 fr_CH
          語言:fr 名稱:法文 fr
          語言:fr 名稱:法文 國家:盧森堡 fr_LU
          語言:fr 名稱:法文 國家:法國 fr_FR
          語言:fr 名稱:法文 國家:加拿大 fr_CA
          語言:ga 名稱:愛爾蘭文 ga
          語言:ga 名稱:愛爾蘭文 國家:愛爾蘭 ga_IE
          語言:hi 名稱:印地文 國家:印度 hi_IN
          語言:hi 名稱:印地文 hi
          語言:hr 名稱:克羅地亞文 國家:克羅地亞 hr_HR
          語言:hr 名稱:克羅地亞文 hr
          語言:hu 名稱:匈牙利文 hu
          語言:hu 名稱:匈牙利文 國家:匈牙利 hu_HU
          語言:in 名稱:印度尼西亞文 in
          語言:in 名稱:印度尼西亞文 國家:印度尼西亞 in_ID
          語言:is 名稱:冰島文 國家:冰島 is_IS
          語言:is 名稱:冰島文 is
          語言:it 名稱:意大利文 it
          語言:it 名稱:意大利文 國家:瑞士 it_CH
          語言:it 名稱:意大利文 國家:意大利 it_IT
          語言:iw 名稱:希伯來文 國家:以色列 iw_IL
          語言:iw 名稱:希伯來文 iw
          語言:ja 名稱:日文 國家:日本 ja_JP_JP_#u-ca-japanese
          語言:ja 名稱:日文 ja
          語言:ja 名稱:日文 國家:日本 ja_JP
          語言:ko 名稱:朝鮮文 ko
          語言:ko 名稱:朝鮮文 國家:韓國 ko_KR
          語言:lt 名稱:立陶宛文 lt
          語言:lt 名稱:立陶宛文 國家:立陶宛 lt_LT
          語言:lv 名稱:拉托維亞文(列托) lv
          語言:lv 名稱:拉托維亞文(列托) 國家:拉脫維亞 lv_LV
          語言:mk 名稱:馬其頓文 mk
          語言:mk 名稱:馬其頓文 國家:馬其頓王國 mk_MK
          語言:ms 名稱:馬來文 國家:馬來西亞 ms_MY
          語言:ms 名稱:馬來文 ms
          語言:mt 名稱:馬耳他文 國家:馬耳他 mt_MT
          語言:mt 名稱:馬耳他文 mt
          語言:nl 名稱:荷蘭文 nl
          語言:nl 名稱:荷蘭文 國家:荷蘭 nl_NL
          語言:nl 名稱:荷蘭文 國家:比利時 nl_BE
          語言:no 名稱:挪威文 國家:挪威 no_NO_NY
          語言:no 名稱:挪威文 國家:挪威 no_NO
          語言:no 名稱:挪威文 no
          語言:pl 名稱:波蘭文 國家:波蘭 pl_PL
          語言:pl 名稱:波蘭文 pl
          語言:pt 名稱:葡萄牙文 pt
          語言:pt 名稱:葡萄牙文 國家:巴西 pt_BR
          語言:pt 名稱:葡萄牙文 國家:葡萄牙 pt_PT
          語言:ro 名稱:羅馬尼亞文 國家:羅馬尼亞 ro_RO
          語言:ro 名稱:羅馬尼亞文 ro
          語言:ru 名稱:俄文 國家:俄羅斯 ru_RU
          語言:ru 名稱:俄文 ru
          語言:sk 名稱:斯洛伐克文 sk
          語言:sk 名稱:斯洛伐克文 國家:斯洛伐克 sk_SK
          語言:sl 名稱:斯洛文尼亞文 sl
          語言:sl 名稱:斯洛文尼亞文 國家:斯洛文尼亞 sl_SI
          語言:sq 名稱:阿爾巴尼亞文 sq
          語言:sq 名稱:阿爾巴尼亞文 國家:阿爾巴尼亞 sq_AL
          語言:sr 名稱:塞爾維亞文 國家:黑山 sr_ME
          語言:sr 名稱:塞爾維亞文 國家:波斯尼亞和黑山共和國 sr_BA_#Latn
          語言:sr 名稱:塞爾維亞文 國家:塞爾維亞及黑山 sr_CS
          語言:sr 名稱:塞爾維亞文 國家:波斯尼亞和黑山共和國 sr_BA
          語言:sr 名稱:塞爾維亞文 國家:黑山 sr_ME_#Latn
          語言:sr 名稱:塞爾維亞文 sr__#Latn
          語言:sr 名稱:塞爾維亞文 國家:塞爾維亞 sr_RS
          語言:sr 名稱:塞爾維亞文 sr
          語言:sr 名稱:塞爾維亞文 國家:塞爾維亞 sr_RS_#Latn
          語言:sv 名稱:瑞典文 國家:瑞典 sv_SE
          語言:sv 名稱:瑞典文 sv
          語言:th 名稱:泰文 國家:泰國 th_TH
          語言:th 名稱:泰文 th
          語言:th 名稱:泰文 國家:泰國 th_TH_TH_#u-nu-thai
          語言:tr 名稱:土耳其文 tr
          語言:tr 名稱:土耳其文 國家:土耳其 tr_TR
          語言:uk 名稱:烏克蘭文 uk
          語言:uk 名稱:烏克蘭文 國家:烏克蘭 uk_UA
          語言:vi 名稱:越南文 國家:越南 vi_VN
          語言:vi 名稱:越南文 vi
          語言:zh 名稱:中文 國家:臺灣地區 zh_TW
          語言:zh 名稱:中文 國家:香港 zh_HK
          語言:zh 名稱:中文 國家:新加坡 zh_SG
          語言:zh 名稱:中文 國家:中國 zh_CN
          語言:zh 名稱:中文 zh

          posted @ 2017-09-27 20:17 leekiang 閱讀(905) | 評論 (0)編輯 收藏


          repositories{
          mavenCentral()
          }
          dependencies {
          compile ('com.google.android.gms:play-services-maps:10.0.1')
          }
          按以上配置,運行clean時報錯,無法加載play-services-maps 10.0.1包。
          Error:(69, 14) Failed to resolve: com.google.android.gms:play-services-maps:10.0.1
          <a href="install.m2.repo">Install Repository and sync project</a><br><a href="openFile:/Users/you/AndroidProjects/yourapp/app/build.gradle">Show in File</a><br><a href="open.dependency.in.project.structure">Show in Project Structure dialog</a>
          點擊Android Studio的提示如何修復的鏈接,就會自動下載Google的相關依賴包到本地。下載時彈出窗口中顯示的一些信息如下。

          Install Missing Componets
          SDK Path:/User/you/Library/Android/sdk

          To install:
          - SDK Patch Applier v4 (patcher;v4)
          - Google Repository (extras;google;m2repository)

          Installing SDK Patch Applier v4
          Downloading https://dl.google.com/android/repository/3534162-studio.sdk-patcher.zip
          Installing SDK Patch Applier v4 in /Users/you/Library/Android/sdk/patcher/v4
          Installation of SDK Patch Applier v4 complete.

          Installing Google Repository
          Downloading https://dl.google.com/android/repository/google_m2repository_gms_v8_rc42_wear_2b1_rc4.zip
          Installing Google Repository in /Users/you/Library/Android/sdk/extras/google/m2repository
          Installation of Google Repository complete.


          http://stackoverflow.com/questions/16978190/add-google-maps-api-v2-in-a-fragment
          http://www.joellipman.com/articles/google/android/application-development/android-os-add-googlemap-as-fragment.html
          https://www.zhihu.com/question/20892245
          http://blog.csdn.net/woshilisao/article/details/8647649 android fragment(android.support.v4.app.Fragment和android.app.Fragment區別)
          http://www.tuicool.com/articles/YFBv6nJ Introduction to Google Maps API for Android

          posted @ 2016-12-21 00:24 leekiang 閱讀(1222) | 評論 (0)編輯 收藏


          https://github.com/lzyzsd/JsBridge  
          注意:使用lzyzsd/JsBridge  ,覆蓋WebViewClient時一定要繼承BridgeWebViewClient,否則js和java互相調用不管用
          webview.setWebViewClient(new BridgeWebViewClient(webview) 

          另外還有一個WebViewJavascriptBridge:https://github.com/gzsll/WebViewJavascriptBridge

          http://www.cnblogs.com/wingyip/p/5426477.html JsBridge實現Javascript和Java的互相調用
          http://blog.csdn.net/sk719887916/article/details/47189607 
           Android 利用WebViewJavascriptBridge 實現js和java的交互
          http://www.jb51.net/article/37208.htm Android在其他線程中更新UI線程的解決方法

          posted @ 2016-11-24 16:19 leekiang 閱讀(367) | 評論 (0)編輯 收藏

          向下一個Activity傳遞數據(使用Bundle和Intent.putExtras)
          Intent it = new Intent(Activity.Main.this, Activity2.class);
          Bundle bundle=new Bundle();
          bundle.putString("name", "This is from MainActivity!");
          it.putExtras(bundle);       // it.putExtra("name","abc");
          startActivity(it);            // startActivityForResult(it,REQUEST_CODE);
           
          對于數據的獲取可以采用:
          Bundle bundle=getIntent().getExtras();
          String name=bundle.getString("name");

          參考:
          http://www.cnblogs.com/feisky/archive/2010/01/16/1649081.html
          http://www.cnblogs.com/tornadomeet/archive/2012/07/28/2613617.html 從一個activity跳轉到另外一個activity

          posted @ 2016-10-26 00:54 leekiang 閱讀(267) | 評論 (0)編輯 收藏

          buildTypes {
          release {
          minifyEnabled false
          proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
          }
          }
          minifyEnabled改為true。
          ProGuard是Android SDK附帶的。如果需要頂尖的安全性,ProGuard就力不從心了,可以使用DexGuard。

          參考:
          讀懂 Android 中的代碼混淆 http://droidyue.com/blog/2016/07/10/understanding-android-obfuscated-code-by-proguard/

          posted @ 2016-10-25 23:41 leekiang 閱讀(387) | 評論 (0)編輯 收藏

          requestWindowFeature(Window.FEATURE_NO_TITLE);
          setContentView(R.layout.activity_main);
          增加代碼requestWindowFeature(Window.FEATURE_NO_TITLE)以去掉標題欄,并且代碼放在setContentView之前,但還是報異常
          android.util.AndroidRuntimeException: requestFeature() must be called before adding content
          AppCompatActivity改為Activity才得以解決。不知道AppCompatActivity和Activity有何區別。

          參考:http://www.cnblogs.com/and_he/archive/2011/06/01/2067106.html Android中全屏或者取消標題欄

          posted @ 2016-10-25 22:38 leekiang 閱讀(547) | 評論 (0)編輯 收藏

           首先在“設置”-“關于手機”里多次點擊【MIUI版本】進入開發者模式,但在Android Studio里運行時找不到設備,執行adb devices也看不到設備。
          在撥號界面按  *#*#717717#*#*  , 出現 Diag USB port enable。 再次執行adb devices,看到設備了,但顯示為unauthorized。
          最后發現,設置-其他高級設置-開發者選項,開啟“開發者選項”,同時開啟“USB調試”,再次執行adb devices,終于成功的顯示設備了。
           

          posted @ 2016-10-24 11:45 leekiang 閱讀(477) | 評論 (0)編輯 收藏

          1.public boolean shouldOverrideUrlLoading(WebView view, String url) { 
                 view.loadUrl(url);
                 return true;
            }
          重寫shouldOverrideUrlLoading方法,返回true表示點擊鏈接是在當前webview里打開,而不是調用瀏覽器打開


          WebViewClient與WebChromeClient的區別 http://blog.csdn.net/jackyhuangch/article/details/8310033
          Android中WebView攔截替換網絡請求數據http://droidyue.com/blog/2014/11/23/block-web-resource-in-webview/
          http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2013/1010/1569.html android WebView全面總結
          自定義可下拉刷新的WebView http://www.voidcn.com/blog/Moy01/article/p-4587219.html
          android webview遠程調試http://www.cnblogs.com/carlos-guo/p/3920915.html
          http://www.udpwork.com/item/13349.html  WebView處理網頁位置請求
          http://www.cnblogs.com/over140/archive/2013/03/07/2947721.html 帶進度條的webview
          http://blog.csdn.net/u014400200/article/details/38511419 webview處理視頻
          http://blog.csdn.net/jackyhuangch/article/details/8310033 關于android WebViewClient和WebChromeClient
          http://www.weblog-life.net/entry/2016/03/12/080300 webview如何使用google地圖,日本人寫的
          http://stackoverflow.com/questions/5329662/android-webview-geolocation  
          https://github.com/delight-im/Android-AdvancedWebView 這個支持地理定位

          posted @ 2016-10-21 21:43 leekiang 閱讀(357) | 評論 (0)編輯 收藏

          1. Android Studio2.2在mac下啟動報錯
          找不到原因,改為使用Android Studio 2.1.3
          下載地址:http://tools.android.com/download/studio/builds/2-1-3

          2. 編譯某項目報錯Could not find property 'config' on SigningConfig container
          在build.grade文件的android->signingConfigs節點下增加config配置
          android {
              signingConfigs {
                  config {
                      keyAlias '你的key別名'
                      keyPassword '你的key密碼'
                      storeFile file('你的密鑰存儲路徑')
                      storePassword '你的存儲密碼'
                  }
              }
          ...

          3. 編譯報錯failed to find target android-22
          /Users/username/Library/Android/sdk/platforms下發現有android-24目錄,故將編譯級別都設為24。
          修改build.grade文件的相關屬性:
          compileSdkVersion 24
          buildToolsVersion "24.0.0"
          targetSdkVersion 24
          compile 'com.android.support:appcompat-v7:24.0.0'

          4. 編譯報錯Gradle sync failed: Gradle DSL method not found: 'android()'
          刪除項目根目錄下的build.gradle文件,因為app目錄下已經有build.gradle了。
          備份下根目錄下build.gradle文件的內容:
          buildscript {
              repositories {
                  jcenter()
              }
              dependencies {
                  classpath 'com.android.tools.build:gradle:1.2.3'
                  // NOTE: Do not place your application dependencies here; they belong
                  // in the individual module build.gradle files
              }
          }
          allprojects {
              repositories {
                  jcenter()
              }
          }
          android {
              compileSdkVersion 24
          }
          dependencies {
          }

          5. 編譯報錯Plugin with id 'com.android.application' not found
          恢復項目根目錄下的build.gradle文件,將內容修改為如下:
          buildscript {
              repositories {
                  mavenCentral()
              }
              dependencies {
                  classpath 'com.android.tools.build:gradle:1.2.3'
              }
          }

          6. 編譯報錯:failed to find Build Tools revision 24.0.0
          /Users/username/Library/Android/sdk/build-tools下查看自己的BuildTools版本,發現是24.0.3,然后將buildToolsVersion修改為該版本:
          buildToolsVersion "24.0.3"

          7. Android Studio編譯執行以下任務時一直等待,執行了一個小時也沒動靜。
          Executing tasks: [:app:generateDebugSources, :app:generateDebugAndroidTestSources, :app:prepareDebugUnitTestDependencies, :app:mockableAndroidJar]
          打開Preferences->Build-Excecution-Deployment->BuildTools->Gra‌​dle,勾選Offline work
          參見http://stackoverflow.com/questions/25629368/how-to-fix-android-studio-getting-stuck-executing-gradle-tasks

          8. Exception in thread "png-cruncher_5" java.lang.RuntimeException: Timed out while waiting for slave aapt process
          不知道原因,最終是通過修改SDK Build Tools為19.1.0、升級JDK由JDK7升至JDK8、增加環境變量SLAVE_AAPT_TIMEOUT=30等搞定的

          9. 如何修改SDK和JDK的路徑
          在File->Project Structure里修改

          10. 修改Android Studio中java代碼的編譯級別
          打開File --> Project Structure-->app,修改Source Compatibility和Target Compatibility

          11.如何在使用gradle時增加--stacktrace參數
          Preferences->Build-Excecution-Deployment->Compiler
          增加--info或--debug,在解決報錯時能看到更多的信息

          12. 報錯aapt ..finished with non- zero exit value 1
          找不到原因,增加編譯參數--info后發現有用的信息:invalid resource directory name: ..app\build\intermediates\res\merged\debug/values-b+sr+Latn

          13.invalid resource directory name: ..app\build\intermediates\res\merged\debug/values-b+sr+Latn
          不知道原因,將版本升級到21解決了。

          14. 編譯時報找不到AppCompatActivity類的錯誤
          改為使用:compile 'com.android.support:appcompat-v7:22.2.1'
          同時將版本由21升級到22

          15. 生成apk時報錯:Missing Gradle Project Information. Please check if the IDE successfully synchronized its state with the Gradle Project Model
          在工具欄里點擊“Sync Project with Gradle Files”按鈕

          16.導入某項目時報錯Error:Gradle version 2.14.1 is required. Current version is 2.4. If using the gradle wrapper, try editing the distributionUrl in...
          打開Android Studio的File->Project Structure,點擊Project,將Gradle version修改為2.14.1
          在/Applications/Android Studio.app/Contents/gradle下的確只有gradle-2.14.1

          25.如何修改生成的apk的名字
          http://www.jianshu.com/p/93051c9e97fb
          Android Studio如何發布APK:http://chenfeicqq.iteye.com/blog/1889160

          26. 在gradle.properties中增加android.enableBuildCache=true,貌似能加快編譯速度。

          posted @ 2016-10-13 21:25 leekiang 閱讀(3875) | 評論 (0)編輯 收藏

          參考dubbo里的NetUtils類

          import java.net.InetAddress;
          import java.net.NetworkInterface;
          import java.util.Enumeration;
          import java.util.regex.Pattern;

          public class GetIP {
          public static void main(String[] args) {
          System.out.println(GetIP.getLocalAddress0().getHostAddress());
          }
          public static InetAddress getLocalAddress0() {
          ??????? InetAddress localAddress = null;
          ??????? try {
          ??????????? localAddress = InetAddress.getLocalHost();
          ??????????? if (isValidAddress(localAddress)) {
          ??????????????? return localAddress;
          ??????????? }
          ??????? } catch (Throwable e) {
          ??????????? System.out.println("Failed to retriving ip address, " + e.getMessage());
          ??????? }
          ??????? try {
          ??????????? Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
          ??????????? if (interfaces != null) {
          ??????????????? while (interfaces.hasMoreElements()) {
          ??????????????????? try {
          ??????????????????????? NetworkInterface network = interfaces.nextElement();
          ??????????????????????? Enumeration<InetAddress> addresses = network.getInetAddresses();
          ??????????????????????? if (addresses != null) {
          ??????????????????????????? while (addresses.hasMoreElements()) {
          ??????????????????????????????? try {
          ??????????????????????????????????? InetAddress address = addresses.nextElement();
          ??????????????????????????????????? if (isValidAddress(address)) {
          ??????????????????????????????????????? return address;
          ??????????????????????????????????? }
          ??????????????????????????????? } catch (Throwable e) {
          ??????????????????????????????????? System.out.println("Failed to retriving ip address, " + e.getMessage());
          ??????????????????????????????? }
          ??????????????????????????? }
          ??????????????????????? }
          ??????????????????? } catch (Throwable e) {
          ??????????????????????? System.out.println("Failed to retriving ip address, " + e.getMessage());
          ??????????????????? }
          ??????????????? }
          ??????????? }
          ??????? } catch (Throwable e) {
          ??????????? System.out.println("Failed to retriving ip address, " + e.getMessage());
          ??????? }
          ??????? System.out.println("Could not get local host ip address, will use 127.0.0.1 instead.");
          ??????? return localAddress;
          ??? }
          ??? private static boolean isValidAddress(InetAddress address) {
          ??????? if (address == null || address.isLoopbackAddress())
          ??????????? return false;
          ??????? String name = address.getHostAddress();
          ??????? return (name != null
          ??????????????? && ! ANYHOST.equals(name)
          ??????????????? && ! LOCALHOST.equals(name)
          ??????????????? && IP_PATTERN.matcher(name).matches());
          ??? }
          ?? ?
          ??? public static final String LOCALHOST = "127.0.0.1";

          ??? public static final String ANYHOST = "0.0.0.0";
          ?? ?
          ??? private static final Pattern IP_PATTERN = Pattern.compile("\\d{1,3}(\\.\\d{1,3}){3,5}$");
          }

          posted @ 2015-03-02 06:29 leekiang 閱讀(665) | 評論 (0)編輯 收藏

          CountDownLatch : 一個線程(或者多個), 等待另外N個線程完成某個事情之后才能執行。? ?
          CyclicBarrier? : N個線程相互等待,任何一個線程完成之前,所有的線程都必須等待。
          這樣應該就清楚一點了,對于CountDownLatch來說,重點是那個“一個線程”, 是它在等待, 而另外那N的線程在把“某個事情”做完之后可以繼續等待,可以終止。而對于CyclicBarrier來說,重點是那N個線程,他們之間任何一個沒有完成,所有的線程都必須等待。

          CyclicBarrier 在釋放等待線程后可以重用,所以稱它為循環的 barrier。它 還支持一個可選的 Runnable 命令,在一組線程中的最后一個線程到達之后(但在釋放所有線程之前),該命令只在每個屏障點運行一次。若在繼續所有參與線程之前更新共享狀態,此屏障操作很有用。



          public class Test {
          ??? public static void main(String[] args) {
          ??????? new Test().test1();
          ??? }
          ?? ?
          ??? public void test1() {
          ??????? CyclicBarrier cyclicBarrier = new CyclicBarrier(4, new Runnable() {
          ??????????? @Override
          ??????????? public void run() {
          ??????????????? System.out.println("所有玩家進入第二關!");
          ??????????? }
          ??????? });

          ??????? for (int i = 0; i < 4; i++) {
          ??????????? new Thread(new Player(i, cyclicBarrier)).start();
          ??????? }
          ??? }

          ??? class Player implements Runnable {
          ??????? private CyclicBarrier cyclicBarrier;
          ??????? private int id;

          ??????? public Player(int id, CyclicBarrier cyclicBarrier) {
          ??????????? this.cyclicBarrier = cyclicBarrier;
          ??????????? this.id = id;
          ??????? }

          ??????? @Override
          ??????? public void run() {
          ??????????? try {
          ??????????????? System.out.println("玩家" + id + "正在玩第一關...");
          ??????????????? cyclicBarrier.await();
          ??????????????? System.out.println("玩家" + id + "進入第二關...");
          ??????????? } catch (InterruptedException e) {
          ??????????????? e.printStackTrace();
          ??????????? } catch (BrokenBarrierException e) {
          ??????????????? e.printStackTrace();
          ??????????? }
          ??????? }
          ??? }
          }

          posted @ 2015-03-02 06:28 leekiang 閱讀(482) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 都安| 交城县| 吐鲁番市| 郁南县| 永清县| 开原市| 湟源县| 赤城县| 临高县| 大渡口区| 禄丰县| 城步| 五河县| 泾源县| 板桥市| 白银市| 珲春市| 新化县| 惠水县| 西安市| 巨鹿县| 宁夏| 芷江| 龙胜| 丰都县| 天水市| 宁陵县| 林口县| 梁山县| 乌兰察布市| 通辽市| 万山特区| 永修县| 洛南县| 桂林市| 贵南县| 原阳县| 贡嘎县| 扎赉特旗| 会同县| 山东|