我正在使用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)
答案 0 :(得分:1)
问题是你试图从非UI线程中显示一个你不能做的吐司,删除它并且它应该工作。
如果您想要显示吐司,那么您必须使用处理程序回调主线程或更好地使用AsyncTask
答案 1 :(得分:0)
您可以使用AsyncTask并在onProgressUpdate和/或onPostExecute函数中实现在UI线程上运行所需的操作。
此外,您可以使用runOnUiThread在UI Thread上执行一段代码 `
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 输出,并查看有关您的计划的任何错误消息。