我正在使用
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)
问题是您正在尝试从非 UI 线程显示 toast,但您无法执行此操作,请将其删除,它应该可以工作。
如果你想显示 toast,那么你必须使用处理程序回调主线程,或者更好地使用
AsyncTask
您可以使用 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 搜索有关程序的任何错误消息。