不显示toast消息android

时间:2013-04-29 14:37:53

标签: android toast

我希望在收到客户端数据时显示消息。我创建了一个服务器和一个客户端。客户端从服务器发送和接收确认,但在服务器端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)

5 个答案:

答案 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。从另一个线程尝试它将导致崩溃。请查看HandlersHandler.CallbacksMessages

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();
        }