首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在方法响应NanoHTTPD上显示演讲稿

在方法响应NanoHTTPD上显示演讲稿
EN

Stack Overflow用户
提问于 2018-02-14 04:59:06
回答 3查看 866关注 0票数 0

我使用NanoHTTPD ()来制作简单的服务器。我也遵循教程进行测试。我在它的GitHub上深入地搜索这个问题,但是我没有找到任何解决方案。我只想显示一个简单的Toast时,有人打开地址从我的项目在他们的浏览器。

下面是我的Server.class的代码:

代码语言:javascript
复制
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时,就像安卓没有将数据发送到浏览器中一样,所以浏览器没有显示正确的输出。

编辑

这是我的日志:

代码语言:javascript
复制
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)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-03-13 01:46:36

如@pskink上面的评论。我已经解决了这个问题。在谷歌上搜索这个关键字android toast background thread和我找到了解决方案。守则如下:

代码语言:javascript
复制
handler.post(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(context, "Receive Connection, Hello " + username , Toast.LENGTH_SHORT).show();
                }
            });
票数 0
EN

Stack Overflow用户

发布于 2018-02-14 08:33:08

不能在NanoHttpd的serve()中显示Toast(),因为它是在线程中执行的。

事实上,你不会看到一个例外。他们已经被奈诺抓住了。

票数 1
EN

Stack Overflow用户

发布于 2018-02-14 05:10:15

我对你的Context context有问题,试着用getApplicationContext()代替context

代码语言:javascript
复制
Toast.makeText(getApplicationContext(), "Receive Connection, Hello " + username , Toast.LENGTH_SHORT).show();

所以在Constructor类中创建Server

代码语言:javascript
复制
public Server (Context ctx){

this.context = ctx;

}

并调用此构造函数来初始化Activity Class中的上下文对象,如下所示

代码语言:javascript
复制
Server server = new Server (MainActivity.this);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48779953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档