为了账号安全,请及时绑定邮箱和手机立即绑定

如何设计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.*注意*,开发一般不这样写,学习的时候可以这样练习。可以试试第三方图片框架,一句话搞定,例如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 关注
  • 2248 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信