Сервисы Android - PullRequest
       21

Сервисы Android

1 голос
/ 01 сентября 2011

Я пишу веб-сервер для Android.На самом деле это работает с потоками, но теперь я бы использовал сервис, чтобы он работал в фоновом режиме.Я заменил тему службой, но я не знаю, в порядке ли этот дизайн ... Когда я нажимаю кнопку, она запускается, и она остается в режиме прослушивания.Когда есть запрос, служба создает поток для его обслуживания.Это моя структура:

WebServer.java

class WebServer extends Service{
 onCreate(){...}
 onDestroy(){...}
}

DroidServer.java

class DroidServer extends WebServer{...}

MyActivity.java

MyActivity extends Activity{
boolean isOn=false;
btn.setOnClickListener(new OnClickListener(){
 public void onClick(View V){
  if(!isOn){
   startService(new Intent(this, DroidWebServer.class));
   btn.setText("Stop");
  }else{
   stopService(new Intent(this, DroidWebServer.class));
   btn.setText("Start");
    }}});
}

AndroidManifest.xml

... <service android:name='DroidWebServer'/> ...

Но когда я нажимаю на кнопку, я получаю это исключение:

FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to Instantiate service it.giox.ws.DroidWebServer: java.lang.InstantiationException: it.giox.ws.DroidWebServer
    at android.app.ActivityThread.handleCreateService(ActivityThread.java:1933)
    at android.app.ActivityThread.access$2500(ActivityThread.java:117)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:985)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:123)
    at android.app.ActivityThread.main(ActivityThread.java:3729)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:507)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:874)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:632)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.InstantiationException: it.giox.ws.DroidWebServer
    at java.lang.Class.newInstanceImpl(Native Method)
    at java.lang.Class.newInstance(Class.java:1409)
    at android.app.ActivityThread.handleCreateService(ActivityThread.java:1930)
    ... 10 more

Где проблема?

Ответы [ 2 ]

2 голосов
/ 01 сентября 2011

Вы видели этот пост?В основном это говорит об ошибке в вашем конструкторе.Его исправление состояло в том, чтобы удалить аргумент, а также убедиться, что он вызвал конструктор супер ...

InstantiationException происходит, когда исключение выдается из конструктора.Как правило, должно быть другое исключение, которое, как сообщается, вызывает InstantiationException, и трассировка стека должна указывать на конкретные строки, которые содержат ошибки.Трассировка стека - ваш друг, и вы должны быть благодарны - они - плохие дети, программирующие на устройствах Symbian, у которых нет трассировки стека.

0 голосов
/ 02 сентября 2011

Реализовали ли вы метод обратного вызова onStartCommand () в своем подклассе (WerServer или DroidServer)? Проверьте Service.startService () для деталей.

Лично я думаю, что использование связанной формы обслуживания более разумно в вашем дизайне, где вы можете заменить отношение «есть» на отношение «есть».

Ваш веб-сервер:

class WebServer implements IWebServer {
  doSoming();
}

Ваш DroidServer:

class DroidServer extends Service {
  private WebServer webServer;
  private WebServerBinder myBinder;

  onCreate(){...}

  IBinder onBind(Intent intent) {
    return myBinder;
  }

  onDestroy(){...}

  protected class WebServerBinder extends Binder implements IWebServer {
    doSomething() {
      myServer.doSomething();
    }
  }

}

В своей деятельности используйте свой DroidServer следующим образом:

public class MyActivity extends Activity {
  private IWebServer myWebService;

  private ServiceConnection myServiceConnection = new ServiceConnection() {
    public void onServiceConnected(ComponentName className, IBinder service) {
      myWebService = (IWebServer) service;
    }

    public void onServiceDisconnected(ComponentName className) {
      if (myWebService != null)
        myWebService = null;
    }
  };

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    bindService(new Intent(this, DroidWebServer.class),
      myServiceConnection, Context.BIND_AUTO_CREATE);

    boolean isOn=false;
    btn.setOnClickListener(new OnClickListener(){
      public void onClick(View V){
        if(!isOn){
          myWebService.doSomething();
          btn.setText("Stop");
        }else{
          myWebService.doSomethingElse(someParam);
          btn.setText("Start");
        }}});
  }

  @Override
  public void onDestroy() {
    super.onDestroy();
    unbindService(myServiceConnection );
  }
}
...