android實現觀察者模式沒有效果,沒有達到預期的效果,不知如何解決

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.