我最近一直在构建一个Android应用程序,我在网络部分遇到了一些问题。首先,我得到了this错误,现在我已经升级了程序,但现在我有另一个问题。我有一个单独的类,它启动自己的发送线程和另一个接收线程。下面是要发送的内容:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import android.widget.EditText;
public class Sender implements Runnable {
private MulticastSocket so;
private InetAddress serverAddress;
private int port;
private EditText messageBoard;
private EditText eText1;
private EditText eText2;
private EditText eText3;
private Thread myActivity = new Thread(this);
public Sender(EditText etHost, EditText etPort, EditText messageBoard, EditText etSend) {
eText1 = etHost;
eText2 = etPort;
eText3 = etSend;
this.messageBoard = messageBoard;
myActivity.start();
}
@Override
public void run() {
// convert the host name to InetAddress
try {
//serverAddress = InetAddress.getByName(eText1.getText().toString());
serverAddress = InetAddress.getByName("atlas.dsv.su.se");
} catch (Exception e) {}
//convert the port to an int
//port = Integer.parseInt(eText2.getText().toString());
port = 4456;
// create socket and start communicating
try {
so = new MulticastSocket(port);
so.joinGroup(serverAddress);
} catch (IOException e) {}
// start listening for incoming messages
new Receiver(so, messageBoard);
}
/**
* This method copies the text from the input text field to the conversation text field and
* cleans the input text field
*/
public void sendMessage() {
// get the text that they contain and add the new messages to the old ones
String message = eText3.getText().toString();
String conversation = messageBoard.getText().toString();
String newConverstion = conversation.concat("\n[You] ").concat(message);
// make the messages text view editable
messageBoard.setFocusable(true);
messageBoard.setText(newConverstion); // add the new message to the text view
messageBoard.setFocusable(false); // make the messages text view not editable
// erase the text on the second text view that has just been sent
eText3.setText("");
// Send message to server
// convert message to bytes array
byte[] data = (message).getBytes();
// create and send a datagram
DatagramPacket packet = new DatagramPacket(data, data.length, serverAddress, port);
try {
so.send(packet);
} catch (IOException e) {}
} // end of sendMessage
}下面是用于接收的代码:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.MulticastSocket;
import android.widget.EditText;
public class Receiver implements Runnable {
private Thread myActivity = new Thread(this);
private MulticastSocket so;
private EditText messageBoard;
public Receiver(MulticastSocket sock, EditText messBo) {
so = sock;
messageBoard = messBo;
myActivity.start();
}
@Override
public void run() {
byte[] data = new byte[1024]; // received data container
while (true) {
try {
// create a datagram for receiving
DatagramPacket packet = new DatagramPacket(data, data.length);
// wait for the next message
so.receive(packet);
String message = new String(data, 0, packet.getLength());
// add the new messages to the old ones
String conversation = messageBoard.getText().toString();
String newConverstion = conversation.concat("\n[Remote] ").concat(message);
// make the messages text view editable
messageBoard.setFocusable(true);
messageBoard.setText(newConverstion); // add the new message to the text view
messageBoard.setFocusable(false); // make the messages text view not editable
} catch (IOException ioe) {}
}
}
}当我运行它时,我得到:
01-25 00:23:27.281: W/dalvikvm(582): threadid=12: thread exiting with uncaught exception (group=0x409c01f8)
01-25 00:23:27.281: E/AndroidRuntime(582): FATAL EXCEPTION: Thread-80
01-25 00:23:27.281: E/AndroidRuntime(582): java.lang.NullPointerException
01-25 00:23:27.281: E/AndroidRuntime(582): at com.regeduser00x.proj1.Receiver.run(Receiver.java:31)
01-25 00:23:27.281: E/AndroidRuntime(582): at java.lang.Thread.run(Thread.java:856)第31行是so.receive(packet);,它的问题是什么?
发布于 2012-01-25 08:13:18
我最好的猜测是你的套接字进入了你的接收器构造函数null。但是如果看不到你是如何尝试使用它的,我就不能确定了。
但是我可以说,您可能会发现使用AsyncTask实现您的类会更简单。它们是专门为了简化线程的创建和交互而创建的。
这里有一些需要检查的东西,它们将帮助你实现你想要实现的目标。
这两个是开发人员文档的一部分:
http://developer.android.com/resources/articles/painless-threading.html
http://developer.android.com/reference/android/os/AsyncTask.html
这里有一个使用AsyncTask的很好的例子:
http://www.screaming-penguin.com/node/7746
https://stackoverflow.com/questions/8996123
复制相似问题