亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何設計Android中需要從網絡獲取數據更新組件的最佳實現?

如何設計Android中需要從網絡獲取數據更新組件的最佳實現?

肆意先生 2016-12-07 22:02:46
聲明:不用框架。學習了一段時間,有幾個問題沒想通:1、網絡獲取數據,肯定要用回調。但是回調貌似不能控制時間...比如這個請求可能10s后才能獲取到數據,那么這10s該如何監控?2、如果是ListView這種含有子項的,每個子項都需要從網絡請求,那么是不是有幾個子項,就要聲明幾個Handler?
查看完整描述

3 回答

?
alionSSS

TA貢獻57條經驗 獲得超82個贊

  1. 第一個問題,不太理解你的意思。監控這10s是什么意思,服務器返回數據的快慢是和網絡有關了,快慢不定。如果想知道什么時候返回的數據,當數據返回后,callback有幾種狀態,舉個栗子:onSuccess、onError、onFailed。這種情況返回時會調用這函數。

  2. ListView這種需要一個adapter來控制,在重寫getView方法中,可直接修改UI,例如給ImageView設置圖片。但是網絡請求屬于延時操作,不可以在這里設置。你可以開子線程請求網絡,在adapter中設置一個handler,網絡請求完成發消息通知handler(發的消息附帶圖片),最后再handler給imageView設置圖片

//adapter中的代碼
@Override
public?View?getView(int?position,?View?convertView,?ViewGroup?parent)?{
????……
????//bitmap是網絡請求得到的圖片
????Message?message?=?new?Message();
????message.obj?=?bitmap;//message攜帶圖片
????mHandler.sendMessage(message);
????……
}
//handler中重寫handleMessage方法
@Override
public?void?handleMessage(Message?msg)?{
????imageView.setImageBitmap((Bitmap)?msg.obj);
}

3.*注意*,開發一般不這樣寫,學習的時候可以這樣練習??梢栽囋嚨谌綀D片框架,一句話搞定,例如Picasso、Fresco等等。

【另外提一下】Handler應該這樣寫(新手如果看不懂的話,在網上多看看、查查吧)

private?MyHandler?mHandler?=?new?MyHandler(this);

private?static?class?MyHandler?extends?Handler?{
????private?final?WeakReference<MainActivity>?mActivity;

????public?MyHandler(MainActivity?activity)?{
????????//對引用對象進行弱引用,利于java垃圾回收機回收,防止引用對象(例如activity)被關閉后,在內存中
????????//仍然持有引用(例如有個10分鐘的延時消息),長期占用內存(activity屬于重量級組件,會占用很多內存)
????????mActivity?=?new?WeakReference<>(activity);
????}

????@Override
????public?void?handleMessage(Message?msg)?{
????????MainActivity?activity?=?mActivity.get();
????????if?(activity?!=?null)?{
????????????
????????}
????}
}


查看完整回答
1 反對 回復 2016-12-08
  • 肆意先生
    肆意先生
    第一個問題,具體來說就是進度條應該怎么做?;卣{的話,不管是什么方法,都是網絡請求相應完畢了,所以想搞一個實時的進度條,肯定不能在回調里做吧,應該在什么地方做呢?
  • alionSSS
    alionSSS
    1.進度的話,可以這樣:例如下載一個10MB的文件,你下載的時候會有InputStream和OutputStream,你會去保存文件對吧?例如每次存1024字節,存滿10MB為止。寫個interface,每次保存的時候回調你里面的函數,傳遞保存了多少的值進去。進度條那邊再實現interface,拿到回調值,顯示到屏幕。這樣就可以顯示進度了。 2.一般都是聲明一個Handler的成員變量,但是開發中handler很少這樣用。除此之外,你還可以這樣寫 new Thread() { @Override public void run() { //先從網絡獲取數據 getDataFromServer(); //更新UI new Handler().post(new Runnable() { @Override public void run() { imageView.setImageBitmap(bitmap); } }); } }.start();
  • alionSSS
    alionSSS
    關于下載那里,可能說得有點模糊,再補充一下。下載一個10mb的文件,服務器會不斷地傳輸數據過來,直到全部傳完。例如每次傳1024byte,你這里就會收到1024byte的inputStream,再用FileOutputStream去存文件(不斷在原文件后面添加)。每次服務器傳輸過來一點,你就存一點,存的時候使用接口回調,實現進度條的UI更新。
點擊展開后面1
?
慕村8705556

TA貢獻7條經驗 獲得超7個贊

這個 。。。不懂

查看完整回答
反對 回復 2016-12-08
  • 3 回答
  • 1 關注
  • 2384 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號