新手,遇到一个问题,折腾了老半天也没找出为什么。我线程同步这块到底有什么问题了?这里用到的也不复杂啊。
package com.example.wangluotongxun;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.UnknownHostException;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setView();
setHandleListener();
setThread1();
}
private Handler handler=null;
private Thread1 thread1=null;
private Thread2 thread2=null;
private String command;
private final Object obj=new Object();
private void setThread1() {
// TODO Auto-generated method stub
thread1=new Thread1();
thread1.start();
}
private void setView() {
// TODO Auto-generated method stub
MViews.tv=(TextView)findViewById(R.id.textview);
MViews.bn=(Button)findViewById(R.id.button);
MViews.et=(TextView)findViewById(R.id.edittext);
OnClickListener l=new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
while(handler==null||thread1==null);
command=MViews.et.getText().toString();
thread2=new Thread2();
thread2.start();
}
};
MViews.bn.setOnClickListener(l);
}
private void setHandleListener() {
handler=new Handler(){
public void handleMessage(Message msg){
switch(msg.what){
case 100:
MViews.tv.setText(msg.getData().getString("str"));break;
case 200:
Toast.makeText(MainActivity.this, msg.getData().getString("str"), Toast.LENGTH_LONG).show();break;
}
}
};
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
private class Thread1 extends Thread{
@SuppressWarnings("unused")
private Socket socket;
private Handler handler;
private DataInputStream in;
private DataOutputStream out;
public void run(){
try {
setsocket();
in=new DataInputStream(socket.getInputStream());
out=new DataOutputStream(socket.getOutputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
while(true){
try {
synchronized(obj){obj.wait();}
startsocket();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private void startsocket() throws IOException{
// TODO Auto-generated method stub
Message msg=new Message();
Bundle bundle=new Bundle();
msg.what=100;
String str="#";
out.writeUTF(command);
out.flush();
while((str=in.readUTF().trim())!=null){
bundle.putString("str",str);
msg.setData(bundle);
handler.sendMessage(msg);
return;
}
}
/**
* @param args
* @throws IOException
*/
private void setsocket() throws IOException{
// TODO Auto-generated method stub
try {
socket=new Socket();
SocketAddress socketAddress=new InetSocketAddress("192.168.1.102",8011);
socket.connect(socketAddress,5000);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
handler.sendMessage(Mmsg.setMessage(200, 0, 1, "str", "Unknow Eorro!"));
} catch (IOException e) {
// TODO Auto-generated catch block
handler.sendMessage(Mmsg.setMessage(200, 0, 1, "str", "Unknow Eorro!"));
}
if (socket.isConnected()){
handler.sendMessage(Mmsg.setMessage(200, 0, 1, "str", "connected!"));
}
else
handler.sendMessage(Mmsg.setMessage(200, 0, 1, "str", "failed to connect!"));
}
}
private class Thread2 extends Thread{
public void run()
{
synchronized(obj){obj.notify();}
}
}
}
package com.example.wangluotongxun;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.UnknownHostException;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setView();
setHandleListener();
setThread1();
}
private Handler handler=null;
private Thread1 thread1=null;
private Thread2 thread2=null;
private String command;
private final Object obj=new Object();
private void setThread1() {
// TODO Auto-generated method stub
thread1=new Thread1();
thread1.start();
}
private void setView() {
// TODO Auto-generated method stub
MViews.tv=(TextView)findViewById(R.id.textview);
MViews.bn=(Button)findViewById(R.id.button);
MViews.et=(TextView)findViewById(R.id.edittext);
OnClickListener l=new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
while(handler==null||thread1==null);
command=MViews.et.getText().toString();
thread2=new Thread2();
thread2.start();
}
};
MViews.bn.setOnClickListener(l);
}
private void setHandleListener() {
handler=new Handler(){
public void handleMessage(Message msg){
switch(msg.what){
case 100:
MViews.tv.setText(msg.getData().getString("str"));break;
case 200:
Toast.makeText(MainActivity.this, msg.getData().getString("str"), Toast.LENGTH_LONG).show();break;
}
}
};
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
private class Thread1 extends Thread{
@SuppressWarnings("unused")
private Socket socket;
private Handler handler;
private DataInputStream in;
private DataOutputStream out;
public void run(){
try {
setsocket();
in=new DataInputStream(socket.getInputStream());
out=new DataOutputStream(socket.getOutputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
while(true){
try {
synchronized(obj){obj.wait();}
startsocket();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private void startsocket() throws IOException{
// TODO Auto-generated method stub
Message msg=new Message();
Bundle bundle=new Bundle();
msg.what=100;
String str="#";
out.writeUTF(command);
out.flush();
while((str=in.readUTF().trim())!=null){
bundle.putString("str",str);
msg.setData(bundle);
handler.sendMessage(msg);
return;
}
}
/**
* @param args
* @throws IOException
*/
private void setsocket() throws IOException{
// TODO Auto-generated method stub
try {
socket=new Socket();
SocketAddress socketAddress=new InetSocketAddress("192.168.1.102",8011);
socket.connect(socketAddress,5000);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
handler.sendMessage(Mmsg.setMessage(200, 0, 1, "str", "Unknow Eorro!"));
} catch (IOException e) {
// TODO Auto-generated catch block
handler.sendMessage(Mmsg.setMessage(200, 0, 1, "str", "Unknow Eorro!"));
}
if (socket.isConnected()){
handler.sendMessage(Mmsg.setMessage(200, 0, 1, "str", "connected!"));
}
else
handler.sendMessage(Mmsg.setMessage(200, 0, 1, "str", "failed to connect!"));
}
}
private class Thread2 extends Thread{
public void run()
{
synchronized(obj){obj.notify();}
}
}
}