由于博主最近时间比较紧张,该部分内容暂时贴上关键代码,待以后有时间再详细说明,请见谅!对于该类,博主在查看Volley的源代码时才发现,请见
Android_开源框架_Volley(Google IO 2013)源代码及内部实现分析
一文!
        /**Service提供的方法*/
public interface IMyBinder {
	public void add(Bean bean);
}/** Service,主要处理网络耗时等操作 */
public class MyService extends Service {
	/** 主要用handler传递一个操作 */
	private Handler handler = new Handler(Looper.getMainLooper());// 默认为MainLooper
	//
	private BlockingQueue<Bean> queue;
	private WorkerThread thread;
	@Override
	public void onCreate() {
		queue = new ArrayBlockingQueue<Bean>(5);
		thread = new WorkerThread();
		//开启线程
		thread.start();
	}
	@Override
	public IBinder onBind(Intent intent) {
		return new MyBinder();
	}
	@Override
	public void onDestroy() {
		if (thread != null && !thread.isInterrupted()) {
			thread.quit();
		}
		super.onDestroy();
	}
	public interface DoWorkCallback {
		public void onUpdateProgress(int progress);
		public void onUpdateCompleted();
	}
	public class MyBinder extends Binder implements IMyBinder {
		@Override
		public void add(Bean bean) {
			queue.add(bean);
		}
	}
	private class WorkerThread extends Thread {
		private boolean isQuited = false;
		@Override
		public void run() {
			while (true) {
				Bean bean = null;
				try {
					//该方法可能是阻塞的
					bean = queue.take();
					if (bean != null) {
						//传递一个操作,有MainLooper执行该runnable的run方法
						handler.post(bean.runnable);
					}
				} catch (InterruptedException e) {
					if (!isQuited) {
						continue;
					} else {
						return;
					}
				}
			}
		}
		//退出线程
		public void quit() {
			isQuited = true;
			queue.clear();
			interrupt();
		}
	}
}public class MainActivity extends Activity {
	private ProgressBar bar;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		bar = (ProgressBar) findViewById(R.id.bar);
	}
	public void click(View view) {
		Intent intent = new Intent(this, MyService.class);
		bindService(intent, connection, BIND_AUTO_CREATE);
	}
	private ServiceConnection connection = new ServiceConnection() {
		/**
		 * 绑定完成,调用该方法,该方法运行在主线程中
		 */
		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			IMyBinder binder = (IMyBinder)service;
			System.out.println("onServiceConnected:"+Thread.currentThread());
			//doWork 接收一个url String 和一个回调接口,主要用于更新ui
			Bean bean = new Bean();
			bean.runnable = new Runnable() {
				
				@Override
				public void run() {
					//TODO:耗时操作
				}
			};
			bean.callback = new DoWorkCallback() {
				
				@Override
				public void onUpdateProgress(int progress) {
					
				}
				
				@Override
				public void onUpdateCompleted() {
					
				}
			};
			binder.add(bean);
		}
		@Override
		public void onServiceDisconnected(ComponentName name) {
		}
	};
}public class Bean {
	public Runnable runnable;
	public DoWorkCallback callback;
} 
                   
                   
                   
                   
                            
 
                             本文介绍了一个自定义的Android服务组件,通过Binder机制实现客户端和服务端的交互,并利用Handler和线程来处理耗时任务,避免UI阻塞。文章展示了如何创建服务、绑定服务以及在服务中执行后台任务的方法。
本文介绍了一个自定义的Android服务组件,通过Binder机制实现客户端和服务端的交互,并利用Handler和线程来处理耗时任务,避免UI阻塞。文章展示了如何创建服务、绑定服务以及在服务中执行后台任务的方法。
           
       
           
                 
                 
                 
                 
                 
                
               
                 
                 
                 
                 
                
               
                 
                 扫一扫
扫一扫
                     
              
             
                   937
					937
					
 被折叠的  条评论
		 为什么被折叠?
被折叠的  条评论
		 为什么被折叠?
		 
		  到【灌水乐园】发言
到【灌水乐园】发言                                
		 
		 
    
   
    
   
             
            


 
            