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

alionSSS
TA貢獻57條經驗 獲得超82個贊
第一個問題,不太理解你的意思。監控這10s是什么意思,服務器返回數據的快慢是和網絡有關了,快慢不定。如果想知道什么時候返回的數據,當數據返回后,callback有幾種狀態,舉個栗子:onSuccess、onError、onFailed。這種情況返回時會調用這函數。
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條
- 3 回答
- 1 關注
- 2384 瀏覽
添加回答
舉報
0/150
提交
取消