Android привязанный сервис с Scala - не могу заставить работать Binder.getService - PullRequest
1 голос
/ 10 марта 2012

Я пытаюсь заставить работать приложение для Android, разработанное в Scala. Но я получаю ошибку во время компиляции

[ERROR] TestService.scala:49: error: type mismatch;
[INFO]     found   : .services.TestService.type (with underlying type object .services.TestService)
[INFO]     required: .services.TestService

Услуги

class TestService extends Service
{
  val mBinder: IBinder = new TestService.TestServiceBinder
  val list  = List("Linux", "Android", "iOs", "WP")

  override def onCreate 
  {
    Toast.makeText(this, TAG + " created", Toast.LENGTH_LONG).show;
    Log.d(TAG, "onCreate");
  }

  override def onDestroy
  {
    Toast.makeText(this, TAG + " destroyed", Toast.LENGTH_LONG).show;
    Log.d(TAG, "onCreate");
  }

  override def onStart(intent: Intent, startid: Int)
  {
    Toast.makeText(this, TAG + " started", Toast.LENGTH_LONG).show;
    Log.d(TAG, "onStart");
  }

  override def onBind(intent: Intent): IBinder = mBinder

  def getList: List[String] = list

}

object TestService
{
  class TestServiceBinder extends Binder
  {
    def getService: TestService = TestService.this
  }
}

активность

class HomeActivity extends Activity with FindView
{

  private final val TAG = "HomeActivity"

  lazy val buttonTest: Button = findView[Button](R.id.testButton)

  private var mService: TestService = _
  private var mBound: Boolean = false

  val mConnection: ServiceConnection = new TestServiceConnection

  override def onCreate(savedInstanceState: Bundle)
  {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.main)

    buttonTest.setOnClickListener(ButtonTestOnClickListener)

    Log.i(TAG, "onCreate")
  }

  override def onStart
  {
    super.onStart
    val intent: Intent = new Intent(this, classOf[TestService])
    bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
  }

  override def onStop
  {
    super.onStop
    if(mBound)
    {
      unbindService(mConnection)
      mBound = false
    }
  }

  object ButtonTestOnClickListener extends View.OnClickListener
  {
    def onClick(v: View)
    {
      if(mBound)
      {
        Toast.makeText(v.getContext, mService.getList.toString, Toast.LENGTH_LONG).show
      }
    }
  }

  class TestServiceConnection extends ServiceConnection
  {
    def onServiceConnected(className: ComponentName, service: IBinder)
    {
      val binder = (new TestService.TestServiceBinder).asInstanceOf[TestServiceBinder]
      mService = binder.getService
      mBound = true
    }

    def onServiceDisconnected(className: ComponentName)
    {
      mBound = false
    }
  }

}

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

РЕДАКТИРОВАТЬ строка 49: def getService: TestService = TestService.this

1 Ответ

0 голосов
/ 12 марта 2012

Я не уверен, что полностью понимаю, почему ваш getService выглядит так, как он выглядит.Почему бы не сделать это так:

def getService: TestService = new TestService

Второе, что я не понимаю, это следующая строка

val binder = (new TestService.TestServiceBinder).asInstanceOf[TestServiceBinder]

Зачем вам здесь asInstanceOf?

РЕДАКТИРОВАТЬ Я думаю, что вы должны сделать это, как в документации Android.В объекте-компаньоне (как вы его реализовали) вы не можете получить доступ к this .

class LocalService extends Service {
   private final val localBinder = new LocalBinder()
   class LocalBinder extends Binder {
      def getService: LocalService = LocalService.this
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...