Android 不';t显示toast消息

Android 不';t显示toast消息,android,toast,Android,Toast,我想在接收到来自客户端的数据时显示一条消息。我启动了一个服务器和一个客户端。客户端从服务器发送和接收确认信息,但在服务器端android上,并没有显示任何消息,应用程序崩溃,我在这里粘贴了从log cat获得的信息。 还有内部类,当我想显示消息时: import android.widget.Toast; class Handler implements Runnable { private Context myContext; private static final

我想在接收到来自客户端的数据时显示一条消息。我启动了一个服务器和一个客户端。客户端从服务器发送和接收确认信息,但在服务器端android上,并没有显示任何消息,应用程序崩溃,我在这里粘贴了从log cat获得的信息。 还有内部类,当我想显示消息时:

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。”;
您还可以通过在代码行中添加断点来尝试逐步调试。