在我的项目中,我使用binder机制与远程服务进行通信。远程服务类将调用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 .`
答案 0 :(得分:1)
您错过了服务告诉活动有关新事件的任何方式。从活动到服务的调用intFromJNI
是一次性的函数调用,只发生一次 - 它没有告诉用户界面未来的变化。
你应该添加一些监听器类。例如,使用以下内容添加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上显示该内容。