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,希望對這方面瞭解的大俠幫個忙解答一下 !!!!!