3、 留意线程的角色
- 在上述的范例程序,都是由主线程所执行的。 由主线程执行所有的调用。 如下图:
也可以创建小线程执行对IS接口的调用
- 例如将上述onClick()函数内容改写为:
public void onClick(View v) {th1 = new Thread(this);th1.start(); }public void run() {//……. isv.f1() }
就诞生小线程去调用IS接口了,如下图:
程序代码
// ILoad.java
// ………
interface ILoad {boolean loadImage();boolean cancel();
}// myService.java
// ………
public class myService extends Service implements ILoad{private final IBinder mBinder;@Override public IBinder onBind(Intent intent) {return mBinder;}@Override public void onCreate(){super.onCreate();mBinder = new myBinder();}public class myBinder extends Binder{ILoad getService(){return myService.this;}}@Override public boolean loadImage() {// loading image from cloud}@Override public boolean cancel() {// cancel loading}
}// myActivity.java
// ……….
public class myActivity extends Activity implements OnClickListener {ILoad isv;Thread th1;// ……..@Override public void onCreate(Bundle savedInstanceState) {// ………Intent intent = new Intent(this,myService.class);bindService(intent, mConnection,Context.BIND_AUTO_CREATE);}private ServiceConnection mConnection = new ServiceConnection(){@Override public void onServiceConnected(ComponentName className, IBinder ibinder) {myBinder ib = (myBinder)ibinder;isv = ib.getService();}@Override public void onServiceDisconnected(ComponentName arg0) { }};@Override public void onClick(View v) {switch( v.getId() ){case 101:th1 = new Thread(this);th1.start();break;case 102:isv.cancel();break;default:break;}}public void run() {isv.loadImage();}
}
- 在这个范例里,活用Android框架提供的Binder基类和IBinder接口。
- 然后配合myService的onBind()函数,将myBinder的IBinder接口回传给myActivity。
- 接着, myActivity并不透过 IBinder接口来调用myService的服务。而是直接调用了myService的IS接口。
- 此外,可擅用小线程来执行比较耗时的服务。