报错内容见截图。在手机上运行没问题。
package com.david.html; import java.util.List; import org.json.JSONArray; import org.json.JSONObject; import com.david.domain.Contact; import com.david.service.ContactService; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.webkit.WebView; public class MainActivity extends Activity { private static final String TAG = "MainActivity"; private WebView webView; private ContactService service; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); service = new ContactService(); webView = (WebView)findViewById(R.id.webView); webView.getSettings().setJavaScriptEnabled(true);//打开脚本功能 webView.addJavascriptInterface(new ContactPlugin(), "david");//创建js插件 // webView.loadUrl("file:///android_asset/index.html");//加载给定路径的web webView.loadUrl("http://192.168.101.160:8080/videoWeb/index.html"); } /** * 定义js插件 * @author davidhuang * */ private class ContactPlugin { public void getContacts() { List<Contact> contacts = service.getContacts();//获取联系人数据 try { JSONArray jsonArray = new JSONArray(); for (int i = 0; i < contacts.size(); i++) { Contact contact = contacts.get(i); JSONObject jsonObject = new JSONObject(); jsonObject.put("id", contact.getId()); jsonObject.put("name", contact.getName().toString()); jsonObject.put("mobile", contact.getMobile()); jsonArray.put(jsonObject); } String jsonString = jsonArray.toString();//转换为json字符串 System.out.println(jsonString); webView.loadUrl("javascript:show('"+jsonString+"')"); } catch (Exception e) { Log.e(TAG, e.toString()); } } public void call(String mobile) { Intent intent = new Intent(Intent.ACTION_CALL,Uri.parse("tel:" + mobile)); startActivity(intent); } } }
Java语言允许在类中再定义类,这种在其它类内部定义的类就叫内部类。内部类又分为:常规内部类、局部内部类、匿名内部类和静态嵌套类四种。我们内部类的知识在Android手机开发中经常用到。
一、常规内部类
所谓常规内部类,或者说内部类,指的就是除去后面三种之外的内部类(这算什么解释。。。)
先写一个最简单的内部类的例子,大家感觉一下:
编译一下,我们看到目录中出现了两个class文件,其中有一个文件名叫做Outer$Inner.class,带了一个$符号,这个特点让我们很容易的认出来这是内部类编译后的class文件。
再写一个稍微复杂一点的内部类:
我们编译以后,运行一下看看:
在上面的例子里我们可以清晰的看到:
下面我们再小结一下内部类的创建方法:
二、局部内部类
我们也可以把类定义在方法内部,这时候我们称这个类叫局部内部类。
我们再看一个例子:
运行程序,查看结果:
我们通过上面这里例子也可以看到下面几点:
是不是有点不好理解?关于为什么用final修饰以后就可以用了,我打算专门在番外篇里专门写一篇博客给你讲清楚,先记住吧。
三、匿名内部类
当我们把内部类的定义和声明写到一起时,就不用给这个类起个类名而是直接使用了,这种形式的内部类根本就没有类名,因此我们叫它匿名内部类。
我们再看一个有趣的例子:
编译和运行程序,查看结果:
竟然编译和运行都很正常,我们知道抽象类和接口肯定无法实例化的,因此刚才的例子肯定有点意思:
好吧我们再看一个例子,方法参数内的匿名内部类:
编译和运行以后的截图我就不给你了,返回值就是“qiu qiu”。
从第14行到第18行是一句话,就是执行一个play方法,而这个方法的参数就由一个匿名内部类的实例来提供。
四、静态嵌套类
为了让你感觉舒服一些,我们也把最简单的内部类放在最后讲。
当一个内部类前面用static修饰时,我们称之为静态嵌套类或者说静态内部类。
上面的例子里其实我们已经看到过静态嵌套类了,下面我们再举一个例子:
因为静态嵌套类和其他静态方法一样只能访问其它静态的成员,而不能访问实例成员。因此静态嵌套类和外部类(封装类)之间的联系就很少了,他们之间可能也就是命名空间上的一些关联。上面例子中你需要注意的就是静态嵌套类的声明方法 new Outer.Nest() 连续写了两个类名,以至于我们都怀疑前面的Outer是个包名了,好在包名一般都小写的,要不还真分不清……
再强调一遍,内部类在Android中应用的非常多,理解和使用好显得蛮重要。
最近试用了一下三星的Galaxy Tab,7寸的,比iPad小了个个儿。
比较郁闷的是,安装不了android market。网上的说法是要么重新刷机,要么更改出厂地。
结果只好放弃了,使用豌豆荚精灵,也能装不少好玩的东东。
如果不是android market受限制,相信,这种pad更易推广。