读书人

Activity 起步一个死循环线程无响应

发布时间: 2013-12-11 16:44:13 作者: rapoo

Activity 启动一个死循环线程无响应


package com.example.myproject;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class ShowTerminal extends Activity implements Runnable{

private Socket socket;
private String IP="127.0.0.1";
private FileInputStream in=null;
private InputStreamReader reader=null;
private String name=null;
private int CurrentCode=0;
private InputStream ins;
private OutputStream outs;
private List<EnameCode> Elist=null;
private int stateCode;
private TextView tv;
private Button btn;
private Thread thread;
private Thread recvthread;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.showterminal);
tv=(TextView)findViewById(R.id.ename);
btn=(Button)findViewById(R.id.onoff);
Intent intent=getIntent();
Bundle bundle=intent.getExtras();
name=bundle.getString("name");
tv.setText(name);
btn.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
int [] comBuf=new int[2];
// TODO Auto-generated method stub
if(stateCode==0){
comBuf[0]=CurrentCode;
comBuf[1]=1;
}
else{
comBuf[0]=CurrentCode;
comBuf[1]=0;
}
byte [] cmd=intToByteArray(comBuf,2);
try {
outs.write(cmd);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
thread=new Thread(ShowTerminal.this);
thread.start();

}
public class EnameCode{
public String Ename=null;
public int Ecode=0;
}
public static byte[] intToByteArray(int [] value,int n) {
byte[] b = new byte[n*4];
for(int j=0;j <n ;j++)
for (int i=j*4 ; i < 4*n; i++) {
int offset = (b.length - 1 - i) * 8;
b[i] = (byte) ((value[j] >>> offset) & 0xFF);
}
return b;
}
public static int bytesToInt(byte[] data, int offset) {
int num = 0;
for (int i = offset; i < offset + 4; i++) {
num <<= 8;
num |= (data[i] & 0xff);
}
return num;
}
public void initCode(){
Elist=new ArrayList<EnameCode>();
int sig=1;
int m=1;
try {
in=openFileInput("smarthouse.txt");
reader=new InputStreamReader(in,"UTF16");
BufferedReader br=new BufferedReader(reader);
String s=null;
EnameCode ec=new EnameCode();
while((s=br.readLine())!=null){
m=sig % 2;
sig++;
if(m!=0){
ec.Ename=s;
}
else{
ec.Ecode=Integer.parseInt(s);
Elist.add(ec);
}
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException E){
E.printStackTrace();
}
for(EnameCode e:Elist){
if(e.Ename.equals(name)){
CurrentCode=e.Ecode;
}
}
}
Handler mHandler=new Handler(){
public void handleMessage(Message msg){
if(msg.arg1==-1||msg.arg1==-2){
tv.setText("error");
}
if(msg.arg1==0){
tv.setText("开");
}
if(msg.arg1==1){
tv.setText("关");
}

}
};
@Override
public void run() {
// TODO Auto-generated method stub
int nameCode;


Message m=mHandler.obtainMessage();
socket=new Socket();
try {
socket.connect(new InetSocketAddress(IP, 8888));
ins=new DataInputStream(socket.getInputStream());
outs=new DataOutputStream(socket.getOutputStream());
int [] command={CurrentCode,1};
outs.write(intToByteArray(command,2));
while(!thread.currentThread().isInterrupted()){

byte[] buffer = new byte[ins.available()];
ins.read(buffer);
if(buffer.length==8){
nameCode=bytesToInt(buffer,0);
stateCode=bytesToInt(buffer,1);
if(nameCode!=CurrentCode){
m.arg1=-2;
}
else{
m.arg1=stateCode;
}
}
else {
m.arg1=-1;
}
mHandler.sendMessage(m);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}


@Override
protected void onDestroy() {
// TODO Auto-generated method stub
if(thread !=null){
thread.interrupt();
thread=null;
}
super.onDestroy();
//setContentView(null);
}

}


请问为什么么这个Activity启动不了,还有如果注释掉线程里的循环可以启动,但是退出后在打开就报错线程已开始了
[解决办法]
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

你的想法太奇葩了 activity继承Runnable
我表示这个...
这不是关键,我就想知道为什么不响应

很遗憾的告诉你 这就是关键
activity运行在主线程 你进行连网不死才怪 另起线程吧
我的run是主线程?学没学过啊


我觉得是你的循环线程把主线程给阻塞死了吧,你加个sleep试试?

读书人网 >Android

热点推荐