我使用NanoHTTPD (这)来制作简单的服务器。我也遵循这教程进行测试。我在它的GitHub上深入地搜索这个问题,但是我没有找到任何解决方案。我只想显示一个简单的Toast时,有人打开地址从我的项目在他们的浏览器。
下面是我的Server.class的代码:
public class Server extends NanoHTTPD {
private static Server server = null;
Context context;
@Override
public Response serve(IHTTPSession session) {
String msg = "My Server in Android\n";
// context = ProgramProperties.getAppContext();
if (session.getMethod() == Method.GET) {
Map<String,String> headers = session.getHeaders();
if (headers.get("username") != null) {
String username = headers.get("username");
msg += "Hi, " + username; /* Output for browser */
// Toast.makeText(context, "Receive Connection, Hello " + username , Toast.LENGTH_SHORT).show();
} else {
msg+="Wrong headers parameters";
// Toast.makeText(context, "Receive Connection with null header", Toast.LENGTH_SHORT).show();
}
}
return newFixedLengthResponse(msg + "</body></html>");
}
private Server() throws IOException {
super(8080);
}
public static Server getServer() throws IOException{
if(server == null){
server = new Server();
}
return server;
}
}我有一个带有静态上下文的单例类,因此我可以保证上面代码中的context不是null。
问题是,当我像上面这样评论行Toast时,一切都是正常的。用户浏览器显示来自Response方法的输出。但是当我使用Toast时,就像安卓没有将数据发送到浏览器中一样,所以浏览器没有显示正确的输出。
编辑
这是我的日志:
02-14 12:31:54.574 25609-26777/com.test.vhp.testproject E/NanoHTTPD: Communication with the client broken, or an bug in the handler code java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
at android.os.Handler.<init>(Handler.java:200)
at android.os.Handler.<init>(Handler.java:114)
at android.widget.Toast$TN$3.<init>(Toast.java:350)
at android.widget.Toast$TN.<init>(Toast.java:350)
at android.widget.Toast.<init>(Toast.java:107)
at android.widget.Toast.makeText(Toast.java:263)
at Server.serve(Server.java:34) at NanoHTTPD.NanoHTTPD$1.handle(NanoHTTPD.java:376)
at NanoHTTPD.NanoHTTPD$1.handle(NanoHTTPD.java:372)
at NanoHTTPD.NanoHTTPD.handle(NanoHTTPD.java:535)
at NanoHTTPD.HTTPSession.execute(HTTPSession.java:421)
at NanoHTTPD.ClientHandler.run(ClientHandler.java:75)
at java.lang.Thread.run(Thread.java:761)
02-14 12:32:04.882 25609-26932/com.test.vhp.testproject E/NanoHTTPD: Communication with the client broken, or an bug in the handler code java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
at android.os.Handler.<init>(Handler.java:200)
at android.os.Handler.<init>(Handler.java:114)
at android.widget.Toast$TN$3.<init>(Toast.java:350)
at android.widget.Toast$TN.<init>(Toast.java:350)
at android.widget.Toast.<init>(Toast.java:107)
at android.widget.Toast.makeText(Toast.java:263) at Server.serve(Server.java:34)
at NanoHTTPD.NanoHTTPD$1.handle(NanoHTTPD.java:376)
at NanoHTTPD.NanoHTTPD$1.handle(NanoHTTPD.java:372)
at NanoHTTPD.NanoHTTPD.handle(NanoHTTPD.java:535)
at NanoHTTPD.HTTPSession.execute(HTTPSession.java:421)
at NanoHTTPD.ClientHandler.run(ClientHandler.java:75)
at java.lang.Thread.run(Thread.java:761)发布于 2018-03-13 01:46:36
如@pskink上面的评论。我已经解决了这个问题。在谷歌上搜索这个关键字android toast background thread和我找到了解决方案。守则如下:
handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(context, "Receive Connection, Hello " + username , Toast.LENGTH_SHORT).show();
}
});发布于 2018-02-14 08:33:08
不能在NanoHttpd的serve()中显示Toast(),因为它是在线程中执行的。
事实上,你不会看到一个例外。他们已经被奈诺抓住了。
发布于 2018-02-14 05:10:15
我对你的Context context有问题,试着用getApplicationContext()代替context
Toast.makeText(getApplicationContext(), "Receive Connection, Hello " + username , Toast.LENGTH_SHORT).show();或
所以在Constructor类中创建Server
public Server (Context ctx){
this.context = ctx;
}并调用此构造函数来初始化Activity Class中的上下文对象,如下所示
Server server = new Server (MainActivity.this);https://stackoverflow.com/questions/48779953
复制相似问题