在j2me联网时,在eclipse控制台下有一个警告:“若要避免潜在的死锁,应该在commandAction()处理程序之外的其他线程中执行可能会阻塞的,操作(如网络连接)。
为了避免潜在的死锁,我们经常把把联网的代码部分写到一个线程中去执行。
而实际应用中,网络连接的事务也都是使用一个单独的线程进行的。
线程的创建可以使用Runnable接口来实现,也可以使用Thread类实现,还可以以匿名内部类的方式创建。在本文中,分别用这三种方式给出了j2me联网的例子。
代码均测试通过。可以直接使用。
1.通过继承Thread类创建
/**
* 测试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接口创建
/**
* 测试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.以匿名内部类的方式创建
即在一个方法中创建线程,当方法被调用时,线程即启动,如下:
/**
* 测试匿名线程线程创建
* @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("超时错误,连接网络失败...");
}
}
}
转载请注明作者和出处。
分享到:
相关推荐
在J2ME中,我们通常使用` javax.microedition.lcdui.ProgressIndicator`接口来实现进度条功能。 实现J2ME进度条通常涉及以下步骤: 1. **创建进度条**:首先,你需要创建一个`ProgressIndicator`实例。可以使用`...
这包括减少内存占用、优化代码执行速度以及合理使用线程。 **10. 安全性** J2ME应用的安全性受到限制,例如不能访问设备的某些敏感功能,这是为了保护用户的隐私和设备安全。开发者需要了解并遵循这些安全策略。 ...
【J2ME手机基于服务器的网络象棋游戏源代码】是一种专门为移动设备设计的网络棋类游戏实现,它利用Java 2 Micro Edition (J2ME) 技术,让玩家能够在手机上与其他在线用户对战。J2ME是Java平台的一个轻量级版本,主要...
7. **网络编程**:J2ME支持联网功能,书中有章节讲述如何实现在线对战、数据同步和更新等网络特性。 8. **性能优化**:由于移动设备硬件限制,性能优化是J2ME游戏开发的关键。书中会给出如何减少内存消耗、提高代码...
8. **网络功能**:虽然坦克大战可能不需要网络功能,但J2ME支持联网,如果源码包含这部分,可能涉及多人在线对战或排行榜的实现。 9. **优化与性能**:J2ME设备的性能有限,所以源码需要考虑内存和CPU使用效率,...
- J2ME中的弱联网实现往往依赖于特定的库,如KVM(K Java Virtual Machine)提供的内置网络API,或者第三方库如Nokia的JSR 82 API(蓝牙连接)或M3GAP(多媒体消息服务)等,它们可以帮助开发者更容易地处理网络...
使用J2ME的Graphics类可以创建各种形状、颜色和文本,实现游戏元素的渲染。为了制作动画,开发者需要掌握如何利用定时器和缓存策略来平滑地过渡帧。 5. **事件处理** J2ME提供了键盘和触摸屏事件处理机制,使得...
例如,KVM(K Virtual Machine)是J2ME的一种轻量级虚拟机,用于实现配置,而Mobile Information Device Profile(MIDP)则提供了在移动设备上开发应用程序的框架。 **MIDP和CLDC** MIDP(Mobile Information ...
通过深入学习和实践这七大技能,你将能够创建出功能完备、运行流畅的J2ME应用程序。同时,不断关注J2ME的更新和发展,如新的Profile和Configuration,将有助于保持技术的前沿性。在学习过程中,参考“J2ME_7_skills....
4. **Chapter 5(ch5):用户界面**:J2ME的用户界面设计可能在这章中进行讲解,包括使用MIDP的Canvas和Form类创建自定义UI,以及如何处理用户输入事件。可能还会介绍如何使用LWUIT( Lightweight User Interface ...
5. **网络功能**:J2ME支持联网功能,使得多人在线游戏成为可能。书中可能包含如何使用MIDP的HttpConnection或SocketConnection进行数据传输的内容。 6. **数据持久化**:为了保存游戏进度,开发者需要了解如何利用...
J2ME应用的数据存储主要依赖于Record Management System (RMS),这是一种简单的键值对存储方式。RMS允许应用在本地设备上保存数据,即使在无网络连接的情况下也能正常工作。 **6. 源代码管理** 压缩包中的"j2me...
- 在J2ME中,多线程是实现并行操作的关键,比如游戏的动画和用户交互可以分别在不同的线程中运行。 7. **性能优化** - 由于J2ME的目标设备通常资源有限,因此代码优化是必要的。例如,避免不必要的对象创建,使用...
5. **网络功能**:虽然"j2me的炸潜艇游戏"可能不涉及网络功能,但J2ME允许开发者添加联网特性,如在线排行榜、多人对战等,这会大大增加游戏的可玩性。 **文件结构分析** 在压缩包文件名称列表中,只有一个文件名...
通过以上步骤,开发者可以构建一个基础的网络环境,进而开发具有联网功能的J2ME游戏。这些游戏可以允许玩家在线对战、交换游戏物品,或者同步游戏进度,极大地增强了游戏的可玩性和互动性。随着移动网络技术的不断...
9. **多线程介绍**:在J2ME中,多线程是实现并发操作的关键。学习者将学习如何创建和管理线程,以确保应用程序的响应性和效率。 10. **Message开发**:这部分可能涉及到J2ME的Messaging API,学习者将学习如何发送...
案例可能涵盖如何使用Connector类发送HTTP请求,获取网页内容,或与服务器进行数据交换,这对于实现联网功能的应用如天气查询、新闻浏览等很有帮助。 4. **多媒体处理**:J2ME提供了JSR-135(Java Bindings for the...
3. **多线程编程**:为了实现流畅的游戏体验,可能需要使用多线程来分离用户交互与游戏逻辑的执行,保证用户操作的即时反馈。 4. **网络通信**:J2ME提供了JSR-82(Java Bluetooth API)和JSR-118(Java Wireless ...