java.Android.这串组织机构代码代表什么么

【图文】第3章Java语法在Android的使用_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
第3章Java语法在Android的使用
上传于||暂无简介
大小:304.50KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢1.java的getInstance() 如何使用?2.下面的代码是什么意思?
public class Smarty {public static Smarty smarty = new Smarty();private Smarty() {}public static Smarty getInstance() {}//省略}3. bty 去掉private Smarty()
}对getInstance()没影响吧???4. 画斜线那句是不应该有的吗?
这是Singleton pattern. 但是现在已经不建议这样写了。首先这没有被lazy initialization,在程序启动时(class Smarty被load)就会创建你的static instance,拖慢启动速度。要解决lazy initialization, 就得这么写:public class Smarty {
private static Smarty instance;
private Smarty() {}
public static Smarty getInstance() {
if(instance == null)
instance = new Smarty();
return instance;
好了,现在instance只会在第一次getInstance被call的时候被创建。但是不好意思,多线程的情况下咋办?恩,似乎应该这样:public class Smarty {
private static Smarty instance;
private Smarty() {}
public synchronized static Smarty getInstance() {
if(instance == null)
instance = new Smarty();
return instance;
看起来不错了,但是每次调用getInstance()都需要synchronized,似乎还可以改进:public class Smarty {
private static Smarty instance;
private Smarty() {}
public static Smarty getInstance() {
if(instance == null) {
synchronized(Smarty.class) {
instance = new Smarty();
return instance;
这样行了吗?好像可以了,但是有个bug,十个线程都进行了null check,但都还没进入synchonized block,大家一起排队等着吃果果。于是十个Smarty排着队被产出来了。不行。那这样呢:public class Smarty {
private static Smarty instance;
private Smarty() {}
public static Smarty getInstance() {
if(instance == null) {
synchronized(Smarty.class) {
if(instance == null) {
instance = new Smarty();
return instance;
你们不是排队等着进来吃果果吗?进来了我再来check一次,这下不可能产出10个了吧。看起来已经完美了,可惜还是不行。这个可能不太好理解,但是下面这一行不是atomic的操作,它实际被分成几个步骤:allocate memory, assign allocated memory to instance ref, initialize the object Smarty into the allocated memory.instance = new Smarty();
所以说如果线程1卡在第三步那里,线程2高高兴兴滴进来拿instance了,他会拿到一个还没煮好的蛋,吃下去,完蛋了。有个keyword,可能一般你很少用到,叫volatile:public class Smarty {
private static volatile Smarty instance;
private Smarty() {}
public static Smarty getInstance() {
if(instance == null) {
synchronized(Smarty.class) {
if(instance == null) {
instance = new Smarty();
return instance;
volatile是什么鬼?看看定义:What is the Java volatile keyword?Essentially, volatile is used to indicate that a variable's value will be modified by different .Declaring a volatile Java variable means:The value of this variable will never be cached thread-locally: all reads and writes will go straight to "main memory";Access to the variable acts as though it is enclosed in a , synchronized on itself.第二点,正是我们需要的,我还没煮完的鸡蛋你先别拿。恩,终于可以了。但是,据说大部分JVM的implementation并不尊重volatile的规则。完蛋啦,搞了半天还是没法确定可以完美做singleton。别紧张,这样写就没问题了。正确的Java Singleton 写法:public class Smarty {
private Smarty() {}
private static class SmartyLoader {
private static final Smarty instance = new Smarty();
public static Smarty getInstance() {
return SmartyLoader.instance;
因为Inner class的loading是在它第一次被调用的时候。合着整了半天就是这么简单。还有一种写法,Java 5之后可用:public enum Smarty {
就是这么简单粗暴直接。下次碰到谁装逼说什么double locking singleton的,上去piapia俩巴掌,甩个enum过去到他脸上,瞬间B格爆满了有没有???不客气!
单例模式private Smarty()
将构造方法私有化,使外部无法直接实例化(new Smarty());static Smarty getInstance();static,可以直接调用Smarty.getInstance()得到这个对象
《Effective Java》里提到过用静态工厂方法代替构造方法,好处是可以返回原返回类型的任何子类型的对象。看看下面这个例子,Calendar是一个抽象类,不可能直接实例化,但Sun不想用户操心使用的到底是一个具体的什么对象。所以JDK为用户提供了一个静态工厂方法getInstance来获取它的实例,而实际上该方法生成的是Calendar的一个子类JapaneseImperialCalendar。public abstract class Calendar implements Serializable, Cloneable, Comparable&Calendar& {
public static Calendar getInstance() {
Calendar cal = createCalendar(TimeZone.getDefaultRef(), Locale.getDefault());
cal.sharedZone = true;
return cal;
private static Calendar createCalendar(TimeZone zone, Locale aLocale) {
// If the specified locale is a Thai locale, returns a BuddhistCalendar
// instance.
if ("th".equals(aLocale.getLanguage())
&& ("TH".equals(aLocale.getCountry()))) {
return new sun.util.BuddhistCalendar(zone, aLocale);
} else if ("JP".equals(aLocale.getVariant())
&& "JP".equals(aLocale.getCountry())
&& "ja".equals(aLocale.getLanguage())) {
return new JapaneseImperialCalendar(zone, aLocale);
// else create the default calendar
return new GregorianCalendar(zone, aLocale);
class JapaneseImperialCalendar extends Calendar {
public JapaneseImperialCalendar(TimeZone zone, Locale aLocale) {
super(zone, aLocale);
jdate = jcal.newCalendarDate(zone);
setTimeInMillis(System.currentTimeMillis());
下面来回答问题里的代码,可能顺序和问题里的不同,简单来说就是这段代码提供了一个Smarty的唯一公用实例。为类实例化一个静态的成员变量是单例模式的一种实现,通常作用是生成一个唯一的实例以供使用。public final class Boolean implements java.io.Serializable, Comparable&Boolean& {
public static final Boolean TRUE = new Boolean(true);
public static final Boolean FALSE = new Boolean(false);
不提供public的构造方法通常是为了防止通过new构造方法来实例化该类。public final class Matcher implements MatchResult {
Matcher() {
1.getInstance是类方法,供外部调用。2.下面的代码是一个饿汉单例模式,但是少了一个private Smarty smarty = new Smarty()。3.去掉的话本身对getInstance没有影响,但是构造方法就可以被外部调用,就不是单例模式了。
单线程环境下,你那么写没问题,但是多线程环境下你那么写,是有可能出问题的:不返回同一个实例:多线程环境下的单例模式为了减少同步代码量,最好使用双重检查:public static Singleton getInstance(){
if (instance == null){
synchronized(Singleton.class){
if (instance == null)
instance = new Singleton();
具体情况参见这篇wiki:
呀,这不是单例吗顾名思义这种设计模式称为单例,就强调在"单"上,表示这个类只会有一个对象(或者说只会有一个实例),使用单例模式的类至少包含三个部分,1.一个私有的构造函数(private smarty()),2.一个私有的对象(你得那个第一行,囧)3.一个共有的返回值为本类的对象的函数(instance())*4.面向本程序需求的函数和对象(实际上没这个的话,要单例干嘛,又不能下锅炖汤(☆_☆))这个设计模式的目的是给程序提供一个全局都可以访问的对象,可以存放一些全局都需要访问或修改的数据,他的基本原理就是在程序的任意地方调用instance(名字可以随便起啦,其实我当时学的时候都叫getXX()^_^)都会返回同一个对象来供你使用。从这里可以看出1.构造函数和2.成员对象私不私有其实不是很大的问题,只要你使用方法规范也不会有什么问题。(但是嘛,就怕哪次手抖了,而且现在不都是强调要封装嘛-_-#)至于有什么用,很多用处,1.这个对象把数值在多线程间传递d2.当你需要传递的参数特别多,且全局很多地方都要用,甚至于需要修改3…………举个栗子比如安卓计步器需要实时反应步数,ui在activity里,计数器在server里(一个程序里的两个类,可以同时运行),你就可以在server里改变单例对象的计数值,在activity里读取该单例对象的几数值,因为单例模式调用的是同一个对象,所以一边变了,另一边也会变。
1.getInstance() 使用方法 因为是static的所以直接用类名调用Smarty.getInstance() 得到一个对象2.这段代码是设计模式之单例模式的一种,所谓单例模式确保某个类只有一个实例。指这个类只能创建一个对象。3.去掉private Smarty() { }
之后,会有一个默认的无参数构造方法相当于public Smarty(){},对getInstance() 是没影响的,但是就可以通过new Smarty()来创建实类了
不符合单例模式的要求4.斜线那句是需要的
不过需要private修饰,没有那句的话getInstance() 无法return出一个实例的下面是一个单例模式
楼主可以看下
//饿汉式单例类.在类初始化时,已经自行实例化
public class Singleton1 {
//已经自行实例化
private static final Singleton1 single = new Singleton1();
//私有的默认构造方法
private Singleton1() {}
//静态工厂方法 用来获取实例
public static Singleton1 getInstance() {
还不清楚的话楼主可以百度单例模式
用手机发的 在知乎上终于看到了我能回答的问题了,有点小激动和小兴奋! 1.getInstance()方法是获取实例的意思 java中有种设计模式叫 单例模式 指一个类只产生一个实例 2.你这段代码是 先在类内部创建一个静态实例 然后私有化了构造器,让外界无法直接创建实例 只能通过 Smarty.getInstance()方法调用获得 3.去掉了就不是单例了啊4.划斜线部分是需要的,不然这个类永远无法实例化
单例模式的一种写法,私有构造是为了防止外部实例,拿掉不会影响运行,但是建议不要拿掉。
已有帐号?
无法登录?
社交帐号登录Android中Java和JavaScript交互实例
投稿:junjie
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了Android中Java和JavaScript交互实例,本文给出了实现方法、实现代码、js调用Java、java调用js等内容,需要的朋友可以参考下
Android提供了一个很强大的WebView控件用来处理Web网页,而在网页中,JavaScript又是一个很举足轻重的脚本。本文将介绍如何实现Java代码和Javascript代码的相互调用。
实现Java和js交互十分便捷。通常只需要以下几步。
1.WebView开启JavaScript脚本执行
2.WebView设置供JavaScript调用的交互接口。
3.客户端和网页端编写调用对方的代码。
为了便于讲解,先贴出全部代码
package com.example.j
import android.annotation.SuppressL
import android.app.A
import android.os.B
import android.util.L
import android.view.M
import android.webkit.JavascriptI
import android.webkit.WebChromeC
import android.webkit.WebS
import android.webkit.WebV
import android.webkit.WebViewC
import android.widget.T
public class MainActivity extends Activity {
& private static final String LOGTAG = "MainActivity";
& @SuppressLint("JavascriptInterface")
& @Override
& protected void onCreate(Bundle savedInstanceState) {
&&&&& super.onCreate(savedInstanceState);
&&&&& setContentView(R.layout.activity_main);
&&&&& final WebView myWebView = (WebView) findViewById(R.id.myWebView);
&&&&& WebSettings settings = myWebView.getSettings();
&&&&& settings.setJavaScriptEnabled(true);
&&&&& myWebView.addJavascriptInterface(new JsInteration(), "control");
&&&&& myWebView.setWebChromeClient(new WebChromeClient() {});
&&&&& myWebView.setWebViewClient(new WebViewClient() {
&&&&&&&&& @Override
&&&&&&&&& public void onPageFinished(WebView view, String url) {
&&&&&&&&&&&&& super.onPageFinished(view, url);
&&&&&&&&&&&&& testMethod(myWebView);
&&&&&&&&& }
&&&&& myWebView.loadUrl("file:///android_asset/js_java_interaction.html");
& private void testMethod(WebView webView) {
&&&&& String call = "javascript:sayHello()";
&&&&& call = "javascript:alertMessage(\"" + "content" + "\")";
&&&&& call = "javascript:toastMessage(\"" + "content" + "\")";
&&&&& call = "javascript:sumToJava(1,2)";
&&&&& webView.loadUrl(call);
& public class JsInteration {
&&&&& @JavascriptInterface
&&&&& public void toastMessage(String message) {
&&&&&&&&& Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();
&&&&& @JavascriptInterface
&&&&& public void onSumResult(int result) {
&&&&&&&&& Log.i(LOGTAG, "onSumResult result=" + result);
前端网页代码
&script type="text/javascript"&
&&& function sayHello() {
&&&&&&& alert("Hello")
&&& function alertMessage(message) {
&&&&&&& alert(message)
&&& function toastMessage(message) {
&&&&&&& window.control.toastMessage(message)
&&& function sumToJava(number1, number2){
&&&&&& window.control.onSumResult(number1 + number2)
Java-Javascript Interaction In Android
js调用Java
调用格式为window.jsInterfaceName.methodName(parameterValues) 此例中我们使用的是control作为注入接口名称。
function toastMessage(message) {
& window.control.toastMessage(message)
function sumToJava(number1, number2){
&& window.control.onSumResult(number1 + number2)
Java调用JS
webView调用js的基本格式为webView.loadUrl(“javascript:methodName(parameterValues)”)
调用js无参无返回值函数
String call = "javascript:sayHello()";
webView.loadUrl(call);
调用js有参无返回值函数
注意对于字符串作为参数值需要进行转义双引号。
String call = "javascript:alertMessage(\"" + "content" + "\")";
webView.loadUrl(call);
调用js有参数有返回值的函数
Android在4.4之前并没有提供直接调用js函数并获取值的方法,所以在此之前,常用的思路是 java调用js方法,js方法执行完毕,再次调用java代码将值返回。
1.Java调用js代码
String call = "javascript:sumToJava(1,2)";
webView.loadUrl(call);
2.js函数处理,并将结果通过调用java方法返回
function sumToJava(number1, number2){
&&&&&& window.control.onSumResult(number1 + number2)
3.Java在回调方法中获取js函数返回值
@JavascriptInterface
public void onSumResult(int result) {
& Log.i(LOGTAG, "onSumResult result=" + result);
Android 4.4之后使用evaluateJavascript即可。这里展示一个简单的交互示例 具有返回值的js方法
function getGreetings() {
&&&&& return 1;
java代码时用evaluateJavascript方法调用
private void testEvaluateJavascript(WebView webView) {
& webView.evaluateJavascript("getGreetings()", new ValueCallback&String&() {
& @Override
& public void onReceiveValue(String value) {
&&&&& Log.i(LOGTAG, "onReceiveValue value=" + value);
I/MainActivity( 1432): onReceiveValue value=1
1.上面限定了结果返回结果为String,对于简单的类型会尝试转换成字符串返回,对于复杂的数据类型,建议以字符串形式的json返回。
2.evaluateJavascript方法必须在UI线程(主线程)调用,因此onReceiveValue也执行在主线程。
Alert无法弹出
你应该是没有设置WebChromeClient,按照以下代码设置
myWebView.setWebChromeClient(new WebChromeClient() {});
Uncaught ReferenceError: functionName is not defined
问题出现原因,网页的js代码没有加载完成,就调用了js方法。解决方法是在网页加载完成之后调用js方法
myWebView.setWebViewClient(new WebViewClient() {
& @Override
& public void onPageFinished(WebView view, String url) {
&&&&& super.onPageFinished(view, url);
&&&&& //在这里执行你想调用的js函数
Uncaught TypeError: Object [object Object] has no method
安全限制问题
如果只在4.2版本以上的机器出问题,那么就是系统处于安全限制的问题了。Android文档这样说的
Caution: If you've set your targetSdkVersion to 17 or higher, you must add the @JavascriptInterface annotation to any method that you want available your web page code (the method must also be public). If you do not provide the annotation, then the method will not accessible by your web page when running on Android 4.2 or higher.
中文大意为
警告:如果你的程序目标平台是17或者是更高,你必须要在暴露给网页可调用的方法(这个方法必须是公开的)加上@JavascriptInterface注释。如果你不这样做的话,在4.2以以后的平台上,网页无法访问到你的方法。
1.将targetSdkVersion设置成17或更高,引入@JavascriptInterface注释
2.自己创建一个注释接口名字为@JavascriptInterface,然后将其引入。注意这个接口不能混淆。这种方式不推荐,大概在4.4之后有问题。
注,创建@JavascriptInterface代码
public @interface JavascriptInterface {
代码混淆问题
如果在没有混淆的版本运行正常,在混淆后的版本的代码运行错误,并提示Uncaught TypeError: Object [object Object] has no method,那就是你没有做混淆例外处理。 在混淆文件加入类似这样的代码
-keep class com.example.javajsinteractiondemo$JsInteration {
All WebView methods must be called on the same thread
过滤日志曾发现过这个问题。
E/StrictMode( 1546): java.lang.Throwable: A WebView method was called on thread 'JavaBridge'. All WebView methods must be called on the same thread. (Expected Looper Looper (main, tid 1) {} called on Looper (JavaBridge, tid 121) {52b6678c}, FYI main Looper is Looper (main, tid 1) {})
E/StrictMode( 1546):&& at android.webkit.WebView.checkThread(WebView.java:2063)
E/StrictMode( 1546):&& at android.webkit.WebView.loadUrl(WebView.java:794)
E/StrictMode( 1546):&& at com.xxx.xxxx.xxxx.xxxx.xxxxxxx$JavaScriptInterface.onCanGoBackResult(xxxx.java:96)
E/StrictMode( 1546):&& at com.android.org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method)
E/StrictMode( 1546):&& at com.android.org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:27)
E/StrictMode( 1546):&& at android.os.Handler.dispatchMessage(Handler.java:102)
E/StrictMode( 1546):&& at android.os.Looper.loop(Looper.java:136)
E/StrictMode( 1546):&& at android.os.HandlerThread.run(HandlerThread.java:61)
在js调用后的Java回调线程并不是主线程。如打印日志可验证
ThreadInfo=Thread[WebViewCoreThread,5,main]
解决上述的异常,将webview操作放在主线程中即可。
webView.post(new Runnable() {
&&& @Override
&&& public void run() {
&&&&&&& webView.loadUrl(YOUR_URL).
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具Java中判断字符串是中文或者英文的工具类分享-android100学习网
Java中判断字符串是中文或者英文的工具类分享
直接上代码:
import java.util.regex.M import java.util.regex.P /**  *
 * <p>
直接上代码:
import java.util.regex.M
import java.util.regex.P
&* ClassName ShowChineseInUnicodeBlock
&* Description 提供判断字符串是中文或者是英文的一种思路
&* @author wangxu
&*&&&&&&&& &p&
&*&&&&&&&& Date
下午06:45:35
&*&&&&&&&& &/p&
&* @version V1.0
public class ShowChineseInUnicodeBlock {
&public static void main(String[] args) {
&&String str = "我爱你,!?():;“”、。";
&&char[] charArray = str.toCharArray();
&&for (int i = 0; i & charArray. i++) {
&&&isChinese(charArray[i]);
&&String chinese = "中国god damn";
&&System.out.println(isContainChinese(chinese));
&&String english = "dfafdabac";
&&System.out.println(isEnglish(english));
& * Title: isChinese
& * Description: 该函数就用来打印一些字符看看属于什么
& * @param c
&public static void isChinese(char c) {
&&Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
&&if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS) {
&&&System.out.println(c + "--CJK_UNIFIED_IDEOGRAPHS");
&&} else if (ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS) {
&&&System.out.println(c + "--CJK_COMPATIBILITY_IDEOGRAPHS");
&&} else if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A) {
&&&// CJK Unified Ideographs Extension WikipediaUnicode扩展汉字
&&&// CJK Unified Ideographs Extension A 中日韩统一表意文字扩展区A ; 表意文字扩充A
&&&// CJK Unified Ideographs Extension B 中日韩统一表意文字扩展区B
&&&System.out.println(c + "--CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A");
&&} else if (ub == Character.UnicodeBlock.GENERAL_PUNCTUATION) {// 通用标点
&&&System.out.println(c + "--GENERAL_PUNCTUATION");
&&} else if (ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION) {
&&&System.out.println(c + "--CJK_SYMBOLS_AND_PUNCTUATION");
&&} else if (ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {
&&&System.out.println(c + "--HALFWIDTH_AND_FULLWIDTH_FORMS");
&public static boolean isEnglish(String charaString) {
&&return charaString.matches("^[a-zA-Z]*");
&public static boolean isContainChinese(String str) {// 检测是否包含中文
&&String regEx = "[\\u4E00-\\u9FA5]+";
&&Pattern p = pile(regEx);
&&Matcher m = p.matcher(str);
&&if (m.find()) {
&&} else {

我要回帖

更多关于 组织机构代码代表什么 的文章

 

随机推荐