我在我的Android应用程序中创建了一个连接到pc服务器的客户端。当我的应用程序连接到服务器时,我希望看到“建立连接”,为此我使用吐司但我的程序在启动时崩溃。这里有代码:
protected String doInBackground(String... params) {
try {
Socket client = new Socket("192.168.1.2", 4444); //connect to server
Toast t = Toast.makeText(getApplicationContext(), "Connection established" ,Toast.LENGTH_LONG);
t.show();
client.close(); //closing the connection
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
我有这个问题,因为我写了“Toast t = Toast.makeText(getApplicationContext(),”Connection established“,Toast.LENGTH_LONG);”
这里有logcat:
05-29 16:28:54.076: E/AndroidRuntime(32436): FATAL EXCEPTION: AsyncTask #1
05-29 16:28:54.076: E/AndroidRuntime(32436): java.lang.RuntimeException: An error occured while executing doInBackground()
05-29 16:28:54.076: E/AndroidRuntime(32436): at android.os.AsyncTask$3.done(AsyncTask.java:299)
05-29 16:28:54.076: E/AndroidRuntime(32436): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
05-29 16:28:54.076: E/AndroidRuntime(32436): at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
05-29 16:28:54.076: E/AndroidRuntime(32436): at java.util.concurrent.FutureTask.run(FutureTask.java:239)
05-29 16:28:54.076: E/AndroidRuntime(32436): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
05-29 16:28:54.076: E/AndroidRuntime(32436): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
05-29 16:28:54.076: E/AndroidRuntime(32436): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
05-29 16:28:54.076: E/AndroidRuntime(32436): at java.lang.Thread.run(Thread.java:841)
05-29 16:28:54.076: E/AndroidRuntime(32436): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
05-29 16:28:54.076: E/AndroidRuntime(32436): at android.os.Handler.<init>(Handler.java:197)
05-29 16:28:54.076: E/AndroidRuntime(32436): at android.os.Handler.<init>(Handler.java:111)
05-29 16:28:54.076: E/AndroidRuntime(32436): at android.widget.Toast$TN.<init>(Toast.java:324)
05-29 16:28:54.076: E/AndroidRuntime(32436): at android.widget.Toast.<init>(Toast.java:91)
05-29 16:28:54.076: E/AndroidRuntime(32436): at android.widget.Toast.makeText(Toast.java:238)
05-29 16:28:54.076: E/AndroidRuntime(32436): at com.example.social_network.MainActivity$myTask.doInBackground(MainActivity.java:34)
05-29 16:28:54.076: E/AndroidRuntime(32436): at com.example.social_network.MainActivity$myTask.doInBackground(MainActivity.java:1)
05-29 16:28:54.076: E/AndroidRuntime(32436): at android.os.AsyncTask$2.call(AsyncTask.java:287)
05-29 16:28:54.076: E/AndroidRuntime(32436): at java.util.concurrent.FutureTask.run(FutureTask.java:234)
05-29 16:28:54.076: E/AndroidRuntime(32436): ... 4 more
感谢
答案 0 :(得分:1)
当然,您需要使用AsyncTask的最佳实践。例如,检查this post。
但如果你想快速测试一下,试试这个:
替换这些行:
Toast t = Toast.makeText(getApplicationContext(), "Connection established", Toast.LENGTH_LONG);
t.show();
这些:
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
public void run() {
Toast t = Toast.makeText(getApplicationContext(), "Connection established", Toast.LENGTH_LONG);
t.show();
}
});
FOR更新代码:
替换此行:
if(result.equalsIgnoreCase("Exception Caught")){
这一个:
if ("Exception Caught".equalsIgnoreCase(result)) {
答案 1 :(得分:1)
Toast
无法显示在doInBackground()
中,因为它与用户界面相关,您无法在doInBackground()
中执行与用户界面相关的任务。您可以在onPostExecute()
或onPreExecute()
。
答案 2 :(得分:0)
看看这个:How to show toast in AsyncTask in doInBackground
你不能在doinbackground中调用Toast。你应该在onPostExecute()或onProgressUpdate()中调用它。
感谢codeMagic。