2015-10-21 2 views
1

Я пытаюсь поймать в приложении Android приложение, отправленное с запросом http. Tanks to nanohttpd, следующий код работает правильно, и я получаю Hello Word в ответ, но теперь я не знаю, как выполнять действие в моей службе Android каждый раз, когда принимается html-запрос (например, сделать простой Toast или что-нибудь еще ...). Как связать класс NanoHTTPD с моим классом обслуживания?Служба Nanohttpd и Android

Мой код:

public class WebServer extends NanoHTTPD { 

    /** 
    * Constructs an HTTP server on given port. 
    */ 
    public WebServer()throws IOException { 
     super(8080); 
    } 


@Override 
    public Response serve(String uri, Method method, 
      Map<String, String> header, Map<String, String> parms, 
      Map<String, String> files) 
    { 
     System.out.println(method + " '222" + uri + "' "); 
     String msg = "<html><body><h1>Hello server</h1>\n"; 
     msg += "</body></html>\n"; 
     //Toast.makeText(this, "http message received", Toast.LENGTH_LONG).show(); 
     return new NanoHTTPD.Response(msg); 
    } 

} 

Вот по Android услуг:

package com.example.domomaster; 

import java.io.IOException; 

import android.app.Service; 
import android.content.Intent; 
import android.os.IBinder; 
import android.widget.Toast; 

public class WebService extends Service { 
    private final static String TAG = "WebService"; 
    WebServer webServer; 

    @Override 
    public IBinder onBind(Intent intent) { 
    Toast.makeText(this, "service bind", Toast.LENGTH_LONG).show(); 
    return null; 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
    //Toast.makeText(this, "service starting", Toast.LENGTH_LONG).show(); 
    try 
    { 
     webServer = new WebServer(); 
     webServer.start(); 
    } 
    catch(IOException ioe) 
    { 
     System.err.println("Couldn't start server:\n" + ioe); 
     System.exit(-1); 
    } 
    Toast.makeText(this, "service Listening on port 8080", Toast.LENGTH_LONG).show(); 
    System.out.println("Listening on port 8080. Hit Enter to stop.\n"); 
    try { System.in.read(); } catch(Throwable t) { 
     System.out.println("read error"); 
    }; 
    return super.onStartCommand(intent,flags,startId); 
    } 

    @Override 
    public void onDestroy() { 
    super.onDestroy(); 
    Toast.makeText(this, "service destroyed", Toast.LENGTH_LONG).show(); 
    } 

} 
+0

Возможно, вам нужно сохранить ссылку на свой 'WebService' в' WebServer'. –

+0

Я знаю, что это старый, но ваш код прав. Что-то не так, чтобы настроить службу? Вы использовали где-то 'startService' (я предполагаю, что вы не опубликовали ВСЕ ваш код)? – KVISH

+0

просто сохраните контекст службы и используйте его в классе WebServer. проверить https://github.com/pathikdevani/Flysync/blob/master/flysync-android/flysync/src/main/java/com/pathik/service/MyService.java –

ответ

0

NanoHTTPD запускает поток работает серверный сокет, это означает, что публичный ответ служить метод вызывается из потока, поэтому вопрос здесь обращается к более абстрактному: как поток посылает сообщения в поток пользовательского интерфейса или службу. В вашем случае вы можете передать обработчик из WebService на WebServer; или отправить трансляцию с WebServer и полученную WebService