现在的位置: 首页 > 综合 > 正文

android实现观察者模式没有效果,没有达到预期的效果,不知如何解决

2013年07月30日 ⁄ 综合 ⁄ 共 2423字 ⁄ 字号 评论关闭

1,问题描述:后台服务上传数据,通知栏中显示进度,上传完成后更新当前界面的状体为已经上传。想着使用观察者模式的方式来进行监听上传的状态,当上传完成后,通知观察者已经上传,然后在当前界面的update()方法中更新界面的状体。但是测试结果为数据能上传,但当前界面的update()方法没有执行。下面为详细的内容

2,点击QurestionCollect 中的listview的Item的”上传“按钮,启动服务进行后台数据上传,通知栏显示上传进度,上传完成后更新界面的上传按钮为 “已经上传”

3,具体的实现方法:

3.1  被观察者继承Observable ,这里显示主要代码

public class ResultDetails extends Observable implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	........省略部分代码
	//通知上传完成
	public void notifyUpload(int position){
		this.position = position;
		setChanged();
		notifyObservers();
	}

	
	

3.2
观察者实现Observer,主要代码

public abstract class QurestionCollect extends BaseActivity implements Observer {
	
	//.........省略部分代码

	@Override
	public void update(Observable observable, Object data) {   //观察到上传完成后更新界面的状态
		// TODO Auto-generated method stub
		if (observable instanceof ResultDetails) {
			ResultDetails rsd = (ResultDetails) observable;
			rslist.set(rsd.getPosition(), rsd);
			adapter.setList(rslist);
			adapter.notifyDataSetChanged();
		}
	}
	class TaskFinistedAdapter extends BaseAdapter {
		//......省略部分代码
		public View getView(final int position, View convertView,
				ViewGroup parent) {
			// TODO Auto-generated method stub
			ViewHolder holder = null;
		
			//省略部分代码...................

			// 上传
			holder.upload.setOnClickListener(new OnClickListener() {
				@Override
				public void onClick(View v) {
					// TODO Auto-generated method stub
					handleUplaod(rsd, position);
				}
			});
			convertView.setTag(holder);
			return convertView;
		}
		public void setList(ArrayList<ResultDetails> list) {
			this.list = list;
		}
		// 上传处理
		private void handleUplaod(ResultDetails rsd, int position) {
			if (!isNetworkAvailable()) {
				setNetwork();
				return;
			}
			rsd.addObserver(QurestionCollect.this); // 添加观察者
			Intent intent = new Intent(QurestionCollect.this,
					UploadService.class);
			intent.setAction(Constact.Upload_Service);
			intent.putExtra("rsd", rsd);
			intent.putExtra("position", position);
			intent.putExtra("common", false);
			startService(intent);	
		}
	}	
}

3.3 在服务中上传完成后通知观察者

	// 后台线程上传处理
	class UploadThread extends AsyncTask<Void, Integer, RspResultAndDetails> {
		private ResultDetails rsd;
		private int position;
		private AppException exception;

		public UploadThread(ResultDetails rsds, int position) {
			this.rsd = rsds;
			this.position = position;
		}

		@Override
		protected RspResultAndDetails doInBackground(Void... params) {
		
		}

		@Override
		protected void onProgressUpdate(Integer... values) {
		
		}

		@Override
		protected void onPostExecute(RspResultAndDetails result) {
			// TODO Auto-generated method stub
			if (result != null) {
				//省略部分代码............
				//上传成功,更新状态
//				rsd.notifyUpload(position);
		
			}
		}
	}

4,整个流程就是这样,不知道为什么QurestionCollect  中的Update()方法没有起作用。因为项目比较急,所有换成了广播的方式来完成,当上传完成后,发送广播,界面接收到广播,更新界面状态。

5,希望对这方面了解的大侠帮个忙解答一下 !!!!!

抱歉!评论已关闭.