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);
}
}
}
// 后台线程上传处理 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); } } }
5,希望对这方面了解的大侠帮个忙解答一下 !!!!!