2012-03-09 9 views
1

私はスカラで開発されたアンドロイドアプリを開発しようとしています。 しかし、私は誰も私を助けたり、私に取得するにはどのように良いチュートリアルを与えることができることを望むコンパイルスカラカントでアンドロイドにバインドされたサービスBinder.getServiceが動作する

[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 
    } 
    } 

} 

中にエラーが発生しますスカラの束縛されたサービスが働きます。 ご協力いただきありがとうございます。 クリス

EDITライン49は、次のとおりです。def getService: TestService = TestService.this

答えて

0

私はあなたのgetServiceは、それが見えるように見える理由は、私は完全には理解していません。なぜそれをそのようにしない:あなたがasInstanceOfここで必要なのはなぜ

def getService: TestService = new TestService 

を私は理解していない2つ目は

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

次の行ですか?

EDITあなたはアンドロイドのドキュメントのようにする必要があると思います。あなたがそれを実装したようなコンパニオンオブジェクトでは、にアクセスすることはできません。これはです。

class LocalService extends Service { 
    private final val localBinder = new LocalBinder() 
    class LocalBinder extends Binder { 
     def getService: LocalService = LocalService.this 
    } 
} 
+0

新しいTestServiceは私に新しいインスタンスを与えます。私はアンドロイドOSによってアンドロイドサービスが開始され、バインダーはシングルトンのようなものだと理解しています。私が試してみるのは、ここに記載されているようにアンドロイドサービスを実装することです:http://developer.android.com/guide/topics/fundamentals/bound-services.html – kitingChris

+0

私のEDITを見ましたか? – Christian

+0

は、どちらもうまくいきませんでした。( あまりにも時間がかかりすぎて、私はJavaに落ちてしまい、私のscala部分が持っているfunktionalityを模倣しようとしています... – kitingChris

関連する問題