0

私のプロジェクトでは、バインダーメカニズムを使用してリモートサービスと通信しています。リモート サービス クラスは JNI 関数を呼び出し、10 秒ごとに UI を更新します。JNI関数には以下のコードがあります

static int n = 100;
  return ++n;

この JNI 関数は Service クラスで呼び出し、以下のように UI に更新します

   public class MyService extends Service{
        private static final String TAG = "MyService";  

        private final Handler serviceHandler = new Handler();

        @Override
        public void onCreate() {
            // TODO Auto-generated method stub
            super.onCreate();  

            System.out.println("inside service onCreate");
            Log.d(TAG, "entered onStart");
            serviceHandler.removeCallbacks(sendUpdatesToUI);
            serviceHandler.postDelayed(sendUpdatesToUI, 1000); // 1 second      
        }

1.      private IMyService.Stub bioStub = new IMyService.Stub() {
2.          
3.          @Override
4.          public int intFromJNI() throws RemoteException {
5.              // TODO Auto-generated method stub  


6.              int libData = Abcd.intFromJNI();
7.              System.out.println("inside ****** stub"+libData);
8.              return libData;         
            }       
        };      


        @Override
        public IBinder onBind(Intent arg0) {

                    // TODO Auto-generated method stub
            System.out.println("inside binder ");       
            return bioStub; 
        }   

        private Runnable sendUpdatesToUI = new Runnable() {
            public void run() {

                Log.d(TAG, "entered Runnable");

                     try {
                        bioStub.intFromJNI();
                        serviceHandler.postDelayed(this, 10000); 
                    } catch (RemoteException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }       

            }
        }; 



    }

This service class is calling in Activty



     @Override
            protected void onResume() {
                // TODO Auto-generated method stub
                super.onResume();

                Intent serviceIntent=new Intent();
                serviceIntent.setClass(context, MyService.class);
                boolean ok=bindService(serviceIntent, mServiceConnection , Context.BIND_AUTO_CREATE);
                Log.v("ok", String.valueOf(ok));
            }

            private ServiceConnection mServiceConnection=new ServiceConnection(){

                @Override
                public void onServiceConnected(ComponentName arg0, IBinder service) {
                    // TODO Auto-generated method stub


                     System.out.println("inside ServiceConnection");
                        myService = IMyService.Stub.asInterface(service);

                    try {

                         Log.d("Client", "entered mServiceConnection");             
8.                       int jniValue = myService.intFromJNI();                      
9.                       System.out.println("value if JNI==>"+jniValue);             
10.                      
                    } catch (RemoteException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                }

                @Override
                public void onServiceDisconnected(ComponentName arg0) {
                    // TODO Auto-generated method stub

                }

            };

ここで私の問題は、サービスクラスは10秒ごとにUIを更新しておらず、値はUIで増加していませんが、値はサービスクラスで10秒ごとに増加しています。つまり、以下のprintステートメントは10秒ごとに更新されています。上記のコード(サービス)の7行目。

System.out.println("inside ****** stub"+libData);

しかし、UIでも更新したいです。つまり、ステートメントの行番号 10 です。

System.out.println("value if JNI==>"+jniValue); 

I`t is not happening in my code . How to solve this one .`
4

1 に答える 1

1

サービスが新しいイベントについてアクティビティに伝える方法がありません。アクティビティからサービスへの呼び出しintFromJNIは、1 回だけ発生する 1 回限りの関数呼び出しです。将来の変更について UI に伝える継続的な責任はありません。

リスナー クラスを追加する必要があります。たとえば、IMyServiceListener.aidl次のように追加します。

package com.something;

interface IMyServiceListener {
    void valueUpdated(int newValue);
}

そして、これをIMyService.aidl追加します:

import com.something.IMyServiceListener;

void addListener(in IMyServiceListener newListener);

次に、IMyService.Stubクラス内で実装する必要がありaddListenerます。結果のオブジェクトをリスナーの配列に追加しvalueUpdated、値が変更されるたびに各リスナーを呼び出す必要があります。

アクティビティ内myService.addListenerで、変更の通知を受け取るオブジェクトを呼び出して渡す必要があります。その後、アクティビティ内の UI に表示できます。

于 2013-05-30T09:07:12.600 に答える