分类归档: Programming

编程编程编程。。。

[转]使用线程创建的三种方式实现j2me联网功能

src: http://www.javaeye.com/topic/420224

在j2me联网时,在eclipse控制台下有一个警告:“若要避免潜在的死锁,应该在commandAction()处理程序之外的其他线程中执行可能 会阻塞的,操作(如网络连接)。
为了避免潜在的死锁,我们经常把把联网的代码部分写到一个线程中去执行。
而实际应用中,网络连接的事务也都是使用一个单独的线程进行的。

线程的创建可以使用Runnable接口来实现,也可以使用Thread类实现,还可以以匿名内部类的方式创建。在本文中,分别用这三种方式给出 了j2me联网的例子。
代码均测试通过。可以直接使用。
1.通过继承Thread类创建

Java 代码
  1. /**  
  2. * 测 试Thread类线程  
  3. * @author mfcai  
  4. */   
  5.   import java.io.BufferedReader;  
  6. import java.io.IOException;  
  7. import java.io.InputStreamReader;  
  8. import java.io.Reader;  
  9. import java.net.HttpURLConnection;  
  10. import java.net.MalformedURLException;  
  11. import java.net.URL;  
  12.   
  13. public class OpenConn implements Runnable {  
  14.     private HttpURLConnection conn;  
  15.     private URL url;  
  16.   
  17.     // Thread thread1;  
  18.   
  19.     public OpenConn(String url) throws MalformedURLException {  
  20.         this.url = new URL(url);  
  21.     }  
  22.   
  23.     public void run() {  
  24.         try {  
  25.             conn = (HttpURLConnection) url.openConnection();  
  26.         } catch (IOException e) {  
  27.             e.printStackTrace();  
  28.             url = null;  
  29.         }  
  30.     }  
  31.   
  32.     public HttpURLConnection getConn() {  
  33.         return conn;  
  34.     }  
  35.   
  36.     public static void main(String[] args) throws Exception {  
  37.         // 创建Runnable类  
  38.         OpenConn openConn = new OpenConn("http://www.google.com");  
  39.         // 创建线程  
  40.         Thread thread = new Thread(openConn);  
  41.         // openConn.thread1=thread;  
  42.         thread.start();  
  43.         thread.join(10000);// wait 10 seconds  
  44.         HttpURLConnection c = openConn.getConn();  
  45.         if (c != null) {  
  46.             System.out.println("连接网络成功…");  
  47.             BufferedReader r = new BufferedReader(new InputStreamReader(c  
  48.                     .getInputStream()));  
  49.             String s = r.readLine();  
  50.             while (s != null) {  
  51.                 System.out.println(s);  
  52.                 s = r.readLine();  
  53.             }  
  54.         } else {  
  55.             System.out.println("超时错误,连接网络失败…");  
  56.         }  
  57.     }  
  58. }  
/**  * 测试Thread类线程  * @author mfcai  */    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL;  public class OpenConn implements Runnable {  private HttpURLConnection conn;  private URL url;   // Thread thread1;   public OpenConn(String url) throws MalformedURLException {   this.url = new URL(url);  }   public void run() {   try {    conn = (HttpURLConnection) url.openConnection();   } catch (IOException e) {    e.printStackTrace();    url = null;   }  }   public HttpURLConnection getConn() {   return conn;  }   public static void main(String[] args) throws Exception {   // 创建Runnable类   OpenConn openConn = new OpenConn("http://www.google.com");   // 创建线程   Thread thread = new Thread(openConn);   // openConn.thread1=thread;   thread.start();   thread.join(10000);// wait 10 seconds   HttpURLConnection c = openConn.getConn();   if (c != null) {    System.out.println("连接网络成功...");    BufferedReader r = new BufferedReader(new InputStreamReader(c      .getInputStream()));    String s = r.readLine();    while (s != null) {     System.out.println(s);     s = r.readLine();    }   } else {    System.out.println("超时错误,连接网络失败...");   }  } }

2.通过引用Runnable接口创建

Java 代码
  1. /**  
  2. * 测 试Runnable接口线程  
  3. * @author mfcai  
  4. */   
  5. import java.io.BufferedReader;  
  6. import java.io.IOException;  
  7. import java.io.InputStreamReader;  
  8. import java.io.Reader;  
  9. import java.net.HttpURLConnection;  
  10. import java.net.MalformedURLException;  
  11. import java.net.URL;  
  12.   
  13. public class OpenConn2 extends Thread {  
  14.     private HttpURLConnection conn;  
  15.     private URL url;  
  16.   
  17.     public OpenConn2(String url) throws MalformedURLException {  
  18.         this.url = new URL(url);  
  19.     }  
  20.   
  21.     public void run() {  
  22.         try {  
  23.             conn = (HttpURLConnection) url.openConnection();  
  24.         } catch (IOException e) {  
  25.             e.printStackTrace();  
  26.             url = null;  
  27.         }  
  28.     }  
  29.   
  30.     public HttpURLConnection getConn() {  
  31.         return conn;  
  32.     }  
  33.   
  34.     public static void main(String[] args) throws Exception {  
  35.         OpenConn2 openConn = new OpenConn2("http://www.google.com");  
  36.         openConn.start();  
  37.         openConn.join(10000);// wait 10 seconds  
  38.         HttpURLConnection c = openConn.getConn();  
  39.         if (c != null) {  
  40.             System.out.println("连接网络成功…");  
  41.             BufferedReader r = new BufferedReader(new InputStreamReader(c  
  42.                     .getInputStream()));  
  43.             String s = r.readLine();  
  44.             while (s != null) {  
  45.                 System.out.println(s);  
  46.                 s = r.readLine();  
  47.             }  
  48.         } else {  
  49.             System.out.println("超时错误,连接网络失败…");  
  50.         }  
  51.     }  
  52. }  
/**  * 测试Runnable接口线程  * @author mfcai  */  import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL;  public class OpenConn2 extends Thread {  private HttpURLConnection conn;  private URL url;   public OpenConn2(String url) throws MalformedURLException {   this.url = new URL(url);  }   public void run() {   try {    conn = (HttpURLConnection) url.openConnection();   } catch (IOException e) {    e.printStackTrace();    url = null;   }  }   public HttpURLConnection getConn() {   return conn;  }   public static void main(String[] args) throws Exception {   OpenConn2 openConn = new OpenConn2("http://www.google.com");   openConn.start();   openConn.join(10000);// wait 10 seconds   HttpURLConnection c = openConn.getConn();   if (c != null) {    System.out.println("连接网络成功...");    BufferedReader r = new BufferedReader(new InputStreamReader(c      .getInputStream()));    String s = r.readLine();    while (s != null) {     System.out.println(s);     s = r.readLine();    }   } else {    System.out.println("超时错误,连接网络失败...");   }  } }

3.以匿名内部类的方式创建
即在一个方法中创建线程,当方法被调用时,线程即启动,如下:

Java 代码
  1. /**  
  2. * 测 试匿名线程线程创建  
  3. * @author mfcai  
  4. */   
  5.   
  6.   
  7. import java.io.BufferedReader;  
  8. import java.io.IOException;  
  9. import java.io.InputStreamReader;  
  10. import java.net.HttpURLConnection;  
  11. import java.net.URL;  
  12.   
  13. public class OpenConn3 {  
  14.     private HttpURLConnection conn;  
  15.     private URL url;  
  16.       
  17.     public static void main(String[] args){  
  18.         try{  
  19.             OpenConn3 open3= new OpenConn3();  
  20.             open3.strartMyThread();  
  21.         }catch(Exception ex){  
  22.             System.out.println(ex.toString());  
  23.         }  
  24.     }  
  25.      public void strartMyThread() throws Exception{   
  26.          this.url =new URL("http://www.google.com");  
  27.          java.lang.Runnable runner=new Runnable(){  
  28.              public void run(){   
  29.                  try {  
  30.                         conn = (HttpURLConnection) url.openConnection();  
  31.                     } catch (IOException e) {  
  32.                         e.printStackTrace();  
  33.                         url = null;  
  34.                     }  
  35.              }  
  36.   
  37.          };  
  38.          Thread openConn=new Thread(runner);   
  39.          openConn.start();   
  40.          openConn.join(10000);// wait 10 seconds  
  41.   
  42.         if (conn != null) {  
  43.             System.out.println("连接网络成功…");  
  44.             BufferedReader r = new BufferedReader(new InputStreamReader(conn  
  45.                     .getInputStream()));  
  46.             String s = r.readLine();  
  47.             while (s != null) {  
  48.                 System.out.println(s);  
  49.                 s = r.readLine();  
  50.             }  
  51.         } else {  
  52.             System.out.println("超时错误,连接网络失败…");  
  53.         }  
  54.   
  55.      }  
  56. }  
/**  * 测试匿名线程线程创建  * @author mfcai  */    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL;  public class OpenConn3 {  private HttpURLConnection conn;  private URL url;    public static void main(String[] args){   try{    OpenConn3 open3= new OpenConn3();    open3.strartMyThread();   }catch(Exception ex){    System.out.println(ex.toString());   }  }   public void strartMyThread() throws Exception{     this.url =new URL("http://www.google.com");          java.lang.Runnable runner=new Runnable(){           public void run(){             try {             conn = (HttpURLConnection) url.openConnection();            } catch (IOException e) {             e.printStackTrace();             url = null;            }           }           };          Thread openConn=new Thread(runner);           openConn.start();           openConn.join(10000);// wait 10 seconds     if (conn != null) {     System.out.println("连接网络成功...");     BufferedReader r = new BufferedReader(new InputStreamReader(conn       .getInputStream()));     String s = r.readLine();     while (s != null) {      System.out.println(s);      s = r.readLine();     }    } else {     System.out.println("超时错误,连接网络失败...");    }    } }

转载请注明作者和出处。

Read: 1072

[转]新京报观察:IE6必须死 却没人做得到

src: http://www.donews.com/Content/201003/ce107084fcb3466ca88b6a2d1b7fc0c6.shtm

观察家

  上周末,一群黑衣人聚集在美国丹佛市某会所内,举行了一场葬礼。葬礼现场烛光摇曳,鲜花环绕,悼词卡片放在逝者的棺材周 围。唯一古怪的是,棺材中的“逝者”没有头,它的头部被一张光盘封套取代———上面的遗容是IE6的徽标。这是一场为IE6浏览器举办的非官方葬礼——尽 管据说微软官方的IE6开发小组也送来了卡片,怀念“那段美好的时光”。

  近年来,IE6无论在安全方面,还是在支持互联网新标准方面, 都越来越老态龙钟。震惊世界的Google被黑客入侵事件,其来源就是IE6的一个漏洞;在上述IE6葬礼的官方网站上,也有哀悼者留言:“我不得不无数 次收拾我父亲的计算机,因为他用您观看网络色情内容……好好在地狱里燃烧自己吧,那是你该呆的地儿”。

  尽管如此,IE6短期内仍然不会 被淘汰。业内人戏称,能让IE6死的,只有微软自己;可是微软连续发出IE7、IE8两张王牌,IE6却仍岿然不动。要论置IE6于死地的决心,微软其实 不比Google小——它已经挡了接班人的路。

  这种尴尬境地,其实反映了微软自己在产业体系上的短板。整个微软-英特尔体系的起家契 机,是PC机体系架构的开放;当大量有生产能力的硬件厂家都能生产PC机时,必需的CPU芯片和操作系统便成为战略物资。但在互联网时代,微软已经不复 1980年时的轻松潇洒。现在要背负封闭体系负担的是它自己。一代一代的windows,为了保持与以前软件、设备的兼容,不得不容忍软件体积的空前膨 胀。到了WindowsXP的继任者Vista推出时,这个操作系统的代码量达到了5000万行,动用了9000名程序员。第一代的windows95只 有1500万行。微软自己拖死了自己,才导致Vista在开发三年之后,于2004年突然全部推翻重来。这个夭折,带来了XP的空前长寿,连带着使XP中 捆绑的IE6成为软件界的奇迹。

  中国又是另一种情况。尽管IE6随XP捆绑,但此后的IE7、IE8,和诸多第三方浏览器如 firefox、chrome、safari等,均开放了免费下载,安装也并不复杂,在使用体验上更是远远超过了IE6。因此,在计算机比较普及的欧美国 家,这些非IE浏览器的市场份额不断增加;在欧洲,firefox甚至在2009年还超越了IE6,成为市场份额第一的浏览器。

  但在中 国,即使号称拥有三亿网民,“互联网潜力最大”,在互联网的应用方面却仍然停留在极为原始的水准。IE6尽管无法完整地显示那些美轮美奂的效果、实现高效 的互动,但在偷菜、卖奴隶、逛网店方面已经绰绰有余了。firefox等优秀浏览器在欧洲大出风头的2009年,中国的IE6份额居然反弹到69%。落后 的浏览器背后,反映的是中国互联网低效、重复的应用开发水准。相应地,中国所有银行的网银,现在都只支持IE系浏览器,这成为世界金融界的奇观。

   阴差阳错的业界现实造就了IE6的长寿,而在微软宣布的正式寿命——2014年——之前,IE6的死亡,看来仍有漫漫长路要走。

  曹悦 平(北京媒体从业者)

Read: 1191

[转]深入理解MIDP的界面类体系

因为在MIDP手机编程中,没有控制台的概念,所以所有的MIDP手机软件都必须有自己的界面,下面就熟悉一下MIDP的界面类体系。

首先说明的是,MIDP的标准界面类都位于javax.microedition.lcdui包中,使用时一定要记得引入。

在界面体系中,所以可以直接显示的界面类都继承自同一个父类——Displayable。根据是否能直接操作屏幕,以及是否和屏幕尺寸相关,MIDP的界面类分为两大类:

1、 高级用户界面——和屏幕大小无关,不能直接操作屏幕

高级用户界面类可以不需要修改就可以在所有支持Java的手机上显示,不同的手机显示方式会有所不同,但功能均可以正常使用。特别适合做对于界面要求不高的手机应用软件。

高级用户界面中的类又分为两个部分:

l 容器类

容器类是指直接或者是间接继承自Displayable,可以直接在屏幕上显示的类。这些类都有一个统一的父类——Screen类,其他的都是实现的容器类,包括以下几个:

u Alert——提示框

u Form——窗体

u List——列表框

u TextBox——文本盒,多行文本框

以上这些类除了Screen类以外,都代表一类界面,在实际的开发过程中,即可以直接使用(只使用其对象)也可以使用继承。

l 控件类

控件类是指那些不能在屏幕上直接显示,必须添加到容器类(注:MIDP中的所有控件类均只能添加到Form中)才可以显示的类。这些类也有一个统一的父类Item类,其它的都是实现的控件类,包括以下几个:

u ChoiceGroup——选择框,包括单选和多选

u DateFiled——日期文本框

u Gauge——进度条

u ImageItem——图片项目

u StringItem——可变字符串项目

u TextFiled——单行文本框

在MIDP2.0中,新增两个控件:

u CustomItem——个性化项目,可以实现自己的控件

u Spacer——空白

在实际的使用中,根据界面的需要,选择合适的控件种类,然后添加到Form中进行显示。

2、 低级用户界面——和屏幕大小相关,可以直接操作屏幕

低 级用户界面可以让程序员直接操作界面,例如可以在屏幕上方便的绘制图片、文字以及基本的图形等,可以在手机中表现复杂的界面,所以很适合进行手机游戏以及 移动证券之类的软件开发。但是低级界面一般和屏幕大小关系比较密切,所以在不同的手机型号之间实现的时候,一般需要进行移植。

低级用户界面主要包括两个类:

l Canvas——手机画布

该类代表手机屏幕,包含获得屏幕属性的一系列方法、事件处理的方法,以及最核心的paint绘制方法等。在MIDP2.0中该类有一个子类——GameCanvas。

l Graphics——画笔

系统所有的绘制动作都通过该类实现,包含一般的绘制方法、设置字体或颜色的方法以及一些技巧操作的方法等。

低级用户界面可以理解为使用Graphics这样一个画笔类在Canvas上进行绘制。

当然还有一个在高级用户界面和低级用户界面都可以使用的类——Command(软按钮类),使用该类可以在界面中实现软按钮的功能。

在整个界面体系中,除了以上最核心的类以外,还包含一些其他的辅助功能,主要分为如下几种:

1、 高级用户事件处理体系

因为高级用户界面的事件处理采用了监听器(Listener)模式,所以在API中只提供了几个接口:

l CommandListener

处理软按钮(Command)事件。

l ItemStateListener

处理控件(Item)状态改变事件。

l ItemCommandListener——MIDP2.0新增

处理和控件相关的软按钮事件。

2、 低级用户界面辅助类

在实际使用低级用户界面中,经常用到图片、字体等,这些也在界面体系中被实现成具体的类,分别是:

l Font——字体类

l Image——图片类

由于J2ME对J2SE进行了大量的简化,所以颜色没有实现成具体的类,而只是支持RGB格式的表示而已。

以上系统的介绍了MIDP的界面类体系,希望能使您对于界面类结构有更加深刻的认识。不足之处请积极指正!

来源:http://bbs.csai.cn/dispbbs.asp?boardid=56&Id=100957&page=7

Read: 842