我希望在收到客户端数据时显示消息。我创建了一个服务器和一个客户端。客户端从服务器发送和接收确认,但在服务器端android,没有显示任何消息,应用程序崩溃,在这里我粘贴我从日志猫得到的。 还有内部类,当我想要显示消息时:
import android.widget.Toast;
class Handler implements Runnable {
private Context myContext;
private static final String TAG = "myLogs";
public Handler(Socket client) {
this.client = client;
}
public Handler(final Context context) {
this.myContext= context;
}
public void run() {
try {
//message received..
Toast.makeText(myContext.getApplicationContext(), "msg msg", Toast.LENGTH_SHORT).show();
Log.d(TAG, "received....");
} catch (IOException e) {
System.out.println("Errore: " + e);
}
}
}
logcat的
04-29 17:21:53.679: D/My log(19533): waiting for connnections
04-29 17:24:13.726: D/My Log(19533): Connected 04-29
17:24:14.859:W/dalvikvm(19533): threadid=9: thread exiting with uncaught exception (group=0x40018578) 04-29 17:24:14.859: E/AndroidRuntime(19533): FATAL EXCEPTION: Thread-10 04-29
17:24:14.859: E/AndroidRuntime(19533): java.lang.NullPointerException 04-29
17:24:14.859:E/AndroidRuntime(19533): at com.example.tcpserver.Handler.run(Handler.java:49) 04-29
17:24:14.859: E/AndroidRuntime(19533): at java.lang.Thread.run(Thread.java:1019)
答案 0 :(得分:2)
您的代码有两个问题。正如其他人所说的那样,第一个是从 non-ui 线程调用命令。虽然从您的代码中看不出来,但logcat建议您从 non-ui 线程调用它。为了显示Toast
消息,您需要确保从UI线程中调用toast。
另一个问题是您尝试使用应用程序上下文显示Toast
。这将失败,因为应用程序上下文无法更新UI。只需使用 Activity 上下文。
您对创建Toast
的要求应修改为如下所示:
myContext.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(myContext, "msg msg", Toast.LENGTH_SHORT).show();
}
});
答案 1 :(得分:0)
您无法在不是主GUI线程的线程中显示toast。
您似乎选择了“Handler”作为您正在撰写的课程的名称。您应该使用android.os.Handler在GUI线程中进行此操作,而不是您的。
此外,您的代码中似乎出现了NullPointerException。你能告诉我们它出现在哪条线上吗? (编辑:代码中哪一行是“Handler.java:49”)
答案 2 :(得分:0)
您只能从UI线程显示toast。从另一个线程尝试它将导致崩溃。请查看Handlers,Handler.Callbacks和Messages。
HTH, 马克
答案 3 :(得分:0)
在看到更完整的代码之后,很明显这个类的设计存在一些重大问题。最明显的是它有两个构造函数可以接收不同的对象,而忽略其他对象。因此,将存在null
套接字或null
上下文。
其次,正如我在其他答案中所说,有一些关于如何显示Toast的缺陷。
我建议你对这门课程进行一些核心修改。对于启动,请删除构造函数并添加它:
public Handler(Activity context, Socket client) {
this.client = client;
this.myContext= context;
}
现在您可以构造一个实例,而不必担心具有空对象。这也强制您使用Activity
上下文构造它 - 因此您可以调用方法unOnUiThread
,所以现在您可以调用:
((Activity) myContext).runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(myContext, "msg msg", Toast.LENGTH_SHORT).show();
}
});
答案 4 :(得分:0)
我遇到了同样的问题。当我在UI线程上调用代码时,问题就解决了我
public void showToastMessage(final String msg) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(BaseActivity.this, msg, Toast.LENGTH_LONG).show();
}