首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2ME开发 >

新手刚学,J2ME联网有关问题

2012-02-01 
新手刚学,J2ME联网问题不废话直接上代码://按下左键时登陆,按下右键时离开if(keyCode KEY_SOFT_L&&!loa

新手刚学,J2ME联网问题
不废话直接上代码:
//按下左键时登陆,按下右键时离开
if(keyCode == KEY_SOFT_L&&!loading){
if("".equals(corpname)||corpname==null){
currentField = 0;
}else if("".equals(userno)||userno==null){
currentField = 1;
}else if("".equals(userpassword)||userpassword==null){
currentField = 2;
}else{
loginClient.getUservo().setCorp(corpid);
loginClient.getUservo().setUserno(userno);
loginClient.getUservo().setUserpassword(userpassword);
try{
Thread t = new LoginThread(loginClient);//创建LoginThread线程
t.start();//线程LoginThread启动为可运行状态,进入LoginThread线程的run方法
t.join();

}catch(Exception e){
System.out.println(e);
}
}
}



public class LoginThread extends Thread{
private LoginClient midlet;


public LoginThread(LoginClient midlet){
this.midlet = midlet;

}
public void run(){

System.out.println("connecting to server......"+midlet.getUservo().getUserno());
HttpConnection httpConn = null;
DataOutputStream dos = null;
DataInputStream dis = null;
try{
httpConn = (HttpConnection)Connector.open("http://192.168.1.100/portal/c/nc/bs/mobile/action/MobileAction?action=login",Connector.READ_WRITE,true);
httpConn.setRequestMethod(HttpConnection.POST);
dos = new DataOutputStream(httpConn.openOutputStream());
dos.writeUTF(midlet.getUservo().getCorp());
dos.writeUTF(midlet.getUservo().getUserno());
dos.writeUTF(midlet.getUservo().getUserpassword());
//连接成功
if(httpConn.getResponseCode() == HttpConnection.HTTP_OK){
dis = new DataInputStream(httpConn.openInputStream());
int length = (int)httpConn.getLength();
if(length > 0){
byte[] servletData = new byte[length];
dis.read(servletData);
//显示返回消息
String2byte betyToStr = new String2byte();
String content = betyToStr.BytesToString(servletData);
String userno = content.substring(content.indexOf("userno:")+"userno:".length(), 
content.indexOf(";username:"));
String username = content.substring(content.indexOf("username:")+"username:".length(), 
content.indexOf(";userpassword:"));
String userpassword = content.substring(content.indexOf("userpassword:")+"userpassword:".length(), 
content.indexOf(";userid:"));
String userid = content.substring(content.indexOf("userid:")+"userid:".length(), 
content.indexOf(";corp:"));
String corp = content.substring(content.indexOf("corp:")+"corp:".length(), 
content.length()-1);

midlet.getUservo().setCorp(corp);
midlet.getUservo().setUserid(userid);
midlet.getUservo().setUsername(username);
midlet.getUservo().setUserno(userno);
midlet.getUservo().setUserpassword(userpassword);
}
}

}catch(IOException e){
System.out.println("==+"+e);
}
try{
if(dos != null){
dos.close();
dos = null;
}
if(dis != null){
dis.close();
dis = null;
}
if(httpConn != null){
httpConn.close();
httpConn = null;
}
}catch(IOException e2){}
}

}
我的想法是这样的,用canvas做一个手机登陆界面,然后当用户输入账号、密码、单位后,然后新开一个线程,(这个时候主线程暂停)这个线程就是做联网操作,与后台服务器连接,然后把用户输入的账号密码单位传到后来,由后台验证完毕再返回数据,然后这个线程接收数据之后。再把数据存到持久类UserVO中,然后线程结束,然后主线程那边启动,验证返回的数据,然后判断是否做登陆成功操作还是登陆失败的操作。
我上面的代码现在问题在于如果我把代码:t.join();这个注销,那么新开的线程能正常运行也能访问后台数据并且返回数据等等,但是主线程却不会暂停先让新开的线程运行完再运行,然后如果我把t.join();这个加上。却会出现新开的线程一直运行到httpConn = (HttpConnection)Connector.open("http://192.168.1.100/portal/c/nc/bs/mobile/action/MobileAction?action=login",Connector.READ_WRITE,true);这句代码就卡住不动。也没报错信息。请各位大大知道是什么问题么?(我也试过在住线程那边使用循环然后判断新开线程某个对象的值来作是否退出循环这样来让主线程等待新开的线程,但这样做新开的线程还是只会运行到httpConn = (HttpConnection)Connector.open("http://192.168.1.100/portal/c/nc/bs/mobile/action/MobileAction?action=login",Connector.READ_WRITE,true);这句就开住不动了..)




[解决办法]
join().我看了下.意思是等待线程终止.
你将它改在线程刚开始的地方.它自然的会停在那里等线程结束 .就好像是走入到胡同里.立马 就碰上墙了 .
另外.低级界面下.必须在线程里进行联网的操作.
你这思路简单.只是逻辑上实现的问题了..
你用一个变量来控制是否登陆成功就成了.
简单来说吧.在输入密码等等后..新开一个线程去联网.在联网后.得到服务器返回的数据.对服务器返回的数据进行判断.看是否成功.若成功了,你则显示成功后的界面.若未成功.你则显示登陆前的界面.
很简单的.
只是看你的思路问题了..

[解决办法]
线程同步..了解下这个..
[解决办法]
实际应用中, 没有把主线程暂停的, 你暂停了主线程,等于界面就假死了。 这种登陆验证的应用, 一般都是当启动联网线程后, 主线程就显示loading 进度条, 当联网线程取会数据并且处理完后,再回传给主线程, 然后主线程把loading界面去掉, 显示从网络取回的结果
[解决办法]

探讨

实际应用中, 没有把主线程暂停的, 你暂停了主线程,等于界面就假死了。 这种登陆验证的应用, 一般都是当启动联网线程后, 主线程就显示loading 进度条, 当联网线程取会数据并且处理完后,再回传给主线程, 然后主线程把loading界面去掉, 显示从网络取回的结果

热点排行