非 UiThread 的线程

问题描述 投票:0回答:2

我正在使用

Thread
来启动我的
ServerSocket
,并且我的交易时间超过 500 毫秒。

我认为这会触发一些“应用程序没有响应”消息。

我尝试创建一个线程将其与

UiThread
分开。

这是我的代码:

Thread socketServerThread=new Thread(new ServerSocketThread());
        socketServerThread.start();

public class ServerSocketThread extends Thread {
    static final int SocketServerPORT = 8080;
    int count = 0;

    @Override
    public void run() {
        try {
            serverSocket = new ServerSocket(SocketServerPORT);

            Toast.makeText(getApplicationContext(), "server is on", Toast.LENGTH_SHORT).show();

            while (true) {
                Socket socket = serverSocket.accept();

            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

我的应用程序在打开时崩溃。

如何解决这些错误?

我的LogCat:

04-11 21:57:23.864: E/AndroidRuntime(11761): FATAL EXCEPTION: Thread-11
04-11 21:57:23.864: E/AndroidRuntime(11761): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
04-11 21:57:23.864: E/AndroidRuntime(11761):    at android.os.Handler.<init>(Handler.java:121)
04-11 21:57:23.864: E/AndroidRuntime(11761):    at android.widget.Toast.<init>(Toast.java:68)
04-11 21:57:23.864: E/AndroidRuntime(11761):    at android.widget.Toast.makeText(Toast.java:231)
04-11 21:57:23.864: E/AndroidRuntime(11761):    at com.example.imagesender.MainActivity$ServerSocketThread.run(MainActivity.java:79)
04-11 21:57:23.864: E/AndroidRuntime(11761):    at java.lang.Thread.run(Thread.java:1019)
android serversocket ui-thread
2个回答
1
投票

问题是您正在尝试从非 UI 线程显示 toast,但您无法执行此操作,请将其删除,它应该可以工作。

如果你想显示 toast,那么你必须使用处理程序回调主线程,或者更好地使用

AsyncTask


0
投票

您可以使用 AsyncTask 并实现需要在 onProgressUpdate 和/或 onPostExecute 函数中的 UI 线程上运行的操作。

你也可以使用runOnUiThread在UI线程上执行一段代码

public void run() {
    // custom thread actions
    mActivity.runOnUiThread(new Runnable() {
        public void run() {
            // code that should be run on UI Thread
        }
    });
    // custom thread actions
}

P.S.:每次崩溃时,请先查看 adb logcat 输出,然后用 google 搜索有关程序的任何错误消息。

© www.soinside.com 2019 - 2024. All rights reserved.