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

来源:互联网 发布:游戏下载软件 编辑:程序博客网 时间:2024/05/30 23:04

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 {//.........省略部分代码@Overridepublic void update(Observable observable, Object data) {   //观察到上传完成后更新界面的状态// TODO Auto-generated method stubif (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 stubViewHolder holder = null;//省略部分代码...................// 上传holder.upload.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubhandleUplaod(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;}@Overrideprotected RspResultAndDetails doInBackground(Void... params) {}@Overrideprotected void onProgressUpdate(Integer... values) {}@Overrideprotected void onPostExecute(RspResultAndDetails result) {// TODO Auto-generated method stubif (result != null) {//省略部分代码............//上传成功,更新状态//rsd.notifyUpload(position);}}}

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

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

原创粉丝点击