Java 安卓服务

Java 安卓服务,java,android,sockets,webserver,android-service,Java,Android,Sockets,Webserver,Android Service,我正在为android编写一个web服务器。实际上,它与线程一起工作,但现在我将使用一个服务使它在后台运行。我用服务替换了线程,但我不知道这个设计是否合适。。。 当我按下一个按钮时,它会启动,然后它会保持监听状态。当有请求时,服务将创建一个线程为其提供服务。 这是我的结构: WebServer.java class WebServer extends Service{ onCreate(){...} onDestroy(){...} } class DroidServer extends

我正在为android编写一个web服务器。实际上,它与线程一起工作,但现在我将使用一个服务使它在后台运行。我用服务替换了线程,但我不知道这个设计是否合适。。。 当我按下一个按钮时,它会启动,然后它会保持监听状态。当有请求时,服务将创建一个线程为其提供服务。 这是我的结构:

WebServer.java

class WebServer extends Service{
 onCreate(){...}
 onDestroy(){...}
}
class DroidServer extends WebServer{...}
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");
    }}});
}
DroidServer.java

class WebServer extends Service{
 onCreate(){...}
 onDestroy(){...}
}
class DroidServer extends WebServer{...}
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");
    }}});
}
MyActivity.java

class WebServer extends Service{
 onCreate(){...}
 onDestroy(){...}
}
class DroidServer extends WebServer{...}
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'/> ...
哪里出了问题?

你看过帖子了吗?它基本上说你的构造函数中有一个错误。他的解决办法是删除参数,并确保调用super的构造函数

实例化异常在异常被抛出时发生 构造器。一般情况下,应报告另一个例外情况 导致实例化异常,堆栈跟踪应指向 到错误的特定行。Stack trace是你的朋友, 你应该心存感激——他们的孩子都很穷 没有堆栈跟踪的Symbian设备


您是否在子类(WerServer或DroidServer)中实现了onStartCommand()回调方法?查看详细信息

就个人而言,我认为在您的设计中使用绑定形式的服务更为合理,您可以用has-a关系替换is-a关系

您的Web服务器:

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 );
  }
}

我的问题是我应该同时扩展服务和Web服务器,但由于这是不可能的,我想知道我的解决方案在概念上是否正确。我看到了那篇文章,但它似乎与我的设计不同。。在我的例子中,我必须将参数传递给构造函数