Android 不';t显示toast消息
我想在接收到来自客户端的数据时显示一条消息。我启动了一个服务器和一个客户端。客户端从服务器发送和接收确认信息,但在服务器端android上,并没有显示任何消息,应用程序崩溃,我在这里粘贴了从log cat获得的信息。 还有内部类,当我想显示消息时:Android 不';t显示toast消息,android,toast,Android,Toast,我想在接收到来自客户端的数据时显示一条消息。我启动了一个服务器和一个客户端。客户端从服务器发送和接收确认信息,但在服务器端android上,并没有显示任何消息,应用程序崩溃,我在这里粘贴了从log cat获得的信息。 还有内部类,当我想显示消息时: import android.widget.Toast; class Handler implements Runnable { private Context myContext; private static final
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)
不能在非主GUI线程的线程内显示toast 似乎您选择了“Handler”作为您正在编写的类的名称。您应该使用android.os.Handler在GUI线程中实现这一点,而不是在您的线程中
此外,代码中似乎有一个NullPointerException。你能告诉我们它发生在哪一行吗?(编辑:代码中哪一行是“Handler.java:49”)您只能从UI线程显示祝酒词。从其他线程尝试将导致崩溃。看一看,然后 嗯,,
Marc您的代码有两个问题。第一个,正如其他人所说的,是从非ui线程调用命令。虽然从代码中看不出这一点,但logcat表明您是从非ui线程调用它的。为了显示
Toast
消息,您需要确保从UI线程中调用Toast
另一个问题是,您试图用应用程序上下文显示Toast
。这将失败,因为应用程序上下文无法更新UI。只需使用活动上下文即可
您创建Toast
的调用应该修改为如下所示:
myContext.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(myContext, "msg msg", Toast.LENGTH_SHORT).show();
}
});
在看到更完整的代码之后,很明显这个类的设计有一些主要问题。最明显的是,它有两个构造函数,它们接受不同的对象,而忽略其他对象。因此,要么存在
null
套接字,要么存在null
上下文
第二,正如我在另一个回答中所说,祝酒词的表达方式存在一些缺陷
我建议您对这个类进行一些核心更改。对于启动,请删除构造函数并添加以下内容:
public Handler(Activity context, Socket client) {
this.client = client;
this.myContext= context;
}
现在您可以构造一个实例,而不必担心有空对象。这还强制您使用Activity
context来构造此方法-因此您可以调用方法unoithread
,现在您可以调用:
((Activity) myContext).runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(myContext, "msg msg", Toast.LENGTH_SHORT).show();
}
});
我也有同样的问题。当我在UI线程上调用代码时,问题就为我解决了
public void showToastMessage(final String msg) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(BaseActivity.this, msg, Toast.LENGTH_LONG).show();
}
你不完整的代码没有任何意义。。。上传更多…你不能从UI线程外显示Toast是的,处理程序我正在编写它的类(我总共有3个类,main,server和handler),你能举个例子吗,因为我不明白什么是GUI线程。。我不知道我在哪一行得到它,我在哪里可以检查它?它说Handler.java第49行。阅读,应该非常有用(确实是强制性的)第49行:Toast.makeText(myContext.getApplicationContext(),“msg msg”,Toast.LENGTH_SHORT).show();然后拆分这一行(1:
text=makeText(…)
,2:text.show()
),然后确定哪一行给出了NPEthis类实现了可运行(类处理程序实现了可运行{),我在run()内调用它,所以我是否在ui线程中?我很困惑。@chajka,您需要将这段代码放在run()内
方法。您的处理程序
类在一个单独的线程上运行。运行
被所有实现可运行
或扩展线程
的类覆盖,因此您将在开发过程中经常看到它。我可以将它放在public void run()之后吗{try{//send//receive//here然后它会要求将强制转换添加到mycontext((对象)myContext).runUnuithRead(new Runnable(){,我需要这个吗?@chajka,把它放在run(){try{//here}catch(异常e){}
。至于强制转换-你可能需要将它强制转换为活动
(是从你的活动中调用的新处理程序(这个)
)?thx,很多,但我再次出错04-29 20:42:34.640:e/AndroidRuntime(23347):致命异常:Thread-10 04-29 20:42:34.640:E/AndroidRuntime(23347):java.lang.NullPointerException 04-29 20:42:34.640:E/AndroidRuntime(23347):在com.example.tcpserver.Handler.run(Handler.java:54)04-29 20:42:34.640:E/AndroidRuntime(23347):在java.lang.Thread.run(Thread.java:1019)上,这是这一行((活动)myContext).runOnUiThread(new Runnable(){@chajka,很高兴我能帮上忙。至于错误是什么-你可以用print语句调试很多。把它添加到你的构造函数:Log.d(“Handler”,“Context is”+Context==null?”null。Socket is:“not null。Socket is”+Socket==null?”null。“:“not null。”;
您还可以通过在代码行中添加断点来尝试逐步调试。