我使用 shell_exec('./php_root '.$cmd);//execute from wrapper
(this)制作简单的服务器。我也按照this教程进行测试。我在GitHub上搜索问题,但我还没有找到任何解决方案。我只想在有人打开浏览器中我的项目提供的地址时显示一个简单的NanoHTTPD
。
以下是我的Server.class的代码:
Toast
我有一个带有静态Context的单例类,所以我可以保证上面代码中的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;
}
}
不为null。
问题是,当我像上面那样评论第context
行时,一切都正常。用户的浏览器显示Toast
方法的输出。但是当我使用Response
时,它就像Android没有将数据发送到浏览器中,因此浏览器无法显示正确的输出。
这是我的日志:
Toast
答案 0 :(得分:1)
您无法在NanoHttpd的serve()中显示Toast(),因为它是在线程中执行的。
确实你不会看到异常。他们已经被nano纳入了。
答案 1 :(得分:0)
Context context
的IMO问题
请尝试getApplicationContext()
而不是context
Toast.makeText(getApplicationContext(), "Receive Connection, Hello " + username , Toast.LENGTH_SHORT).show();
或强>
所以在Constructor
类
Server
public Server (Context ctx){
this.context = ctx;
}
并调用此构造函数来初始化Activity Class
中的Context对象
Server server = new Server (MainActivity.this);
答案 2 :(得分:0)
正如上面的@pskink评论。我已经解决了这个问题。谷歌搜索此关键字android toast background thread
,我找到了解决方案。也许这将有助于其他未来。代码下方:
handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(context, "Receive Connection, Hello " + username , Toast.LENGTH_SHORT).show();
}
});