来,和大家探讨个问题,activity和fragment异步传输数据的问题

哎,真难 2014-07-31 06:23:12
发个讨论帖,最近发现以前写的代码有点傻逼,想改进下,需求是这样的:
进入MainActivity,会启动异步线程访问网络,把获得到数据给fragment显示出来,看起来很简单,其实内在有个通行机制逻辑,让我很困惑。
因为进入MainActivity的时候,之前的Activity会传入一个JSONString过来,你要在把这个JSONString给POST到服务器才能返回值,但是根据activity和fragment的生命周期,你不可能在MainActivity里面启动异步线程访问网络,获取得到值以后再去传值给fragment,因为fragment已经oncreateview了。
以前傻逼的方法就是在生成fragment的时候,把JSONstring放到bundler里面传到fragment里面,再从fragment里面访问网络,获得数据。但是有N个fragment的时候就要访问网络N次了。
所以想和大家讨论下activity和fragment异步传输数据的方法,有没有其它更好的方法实现这种回调,,,

PS:最近处于待业状态,忙得很,邀请回帖的别介意我没回复,别邀请了还发私信,,,
...全文
1133 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
liao_hb 2015-09-08
  • 打赏
  • 举报
回复
引用 31 楼 heaimnmn 的回复:
引用 30 楼 liao_hb 的回复:
也在坐等这个问题,搂住,解决了吗?
我没印象了,好像没解决,还是请求了N次了
是个棘手的问题
哎,真难 2015-09-08
  • 打赏
  • 举报
回复
引用 30 楼 liao_hb 的回复:
也在坐等这个问题,搂住,解决了吗?
我没印象了,好像没解决,还是请求了N次了
liao_hb 2015-09-04
  • 打赏
  • 举报
回复
也在坐等这个问题,搂住,解决了吗?
jeky_zhang2013 2014-08-04
  • 打赏
  • 举报
回复
引用 8 楼 heaimnmn 的回复:
引用 5 楼 jeky198306 的回复:
activity和fragment是独立的,activity可以用异步线程去做些事情的,你可以看下SyncTask类。
回复错了,fragment的oncreateview的在oncreateactivity之前,你怎么后面去异步了???
fragment可以监听activity,activity有变化的时候可以通知fragment更新,fragment是可以变化的
  • 打赏
  • 举报
回复
引用 22 楼 heaimnmn 的回复:
update是否可以重新更新界面view,但是好像用户体验性不好,比如你进入一个fragment,显示了一个默认的界面,过了一会数据更新好了,又显示一个新的界面,,,
额,你说这个啊?加几个过渡动画就可以吧?nineoldandroids.jar,这个还是你告诉我的。
_deadline 2014-08-02
  • 打赏
  • 举报
回复
在MainActivity里 new一个JsonObject 。。。。 保存在MainActivity 注意这个变量要是Public的然后把这个值给子Fragment
a291318254 2014-08-01
  • 打赏
  • 举报
回复
是activity 先创建 后再oncreateView的吧。。
sagittarius1988 2014-08-01
  • 打赏
  • 举报
回复
网络请求的是否可以统一在一个网络请求类管理呢?需要时,只需传入参数和回调,请求好后,在回调中获取
Birds2018 2014-08-01
  • 打赏
  • 举报
回复
不知道理解可对: 在Fragment可以提前初始化 onCreateView()这个方法 onCreateView(){ //此时还没有数据,所以显示 数据正在加载中 showLoadingView()吧 return view; } public void onUpdateView(JSONDATA data){ //现在UI线程中更新 之前Fragment还在显示loadingView, } class MainActivity { //activty中做异步请求数据,如果请求成功 调用 Fragment中自己写的onUpdateView()方法. } //但我到喜欢把网络数据请求都写在service里面,然后网络获取数据结果通过广播回调 Intent intent = new Intent(this,MyService.class); //这个Service 就是专门请求网络数据的。 intent.putString("reqURL",myURL); intent.putString("params",params); startService(intent); 在onStartCommand() 里面通过判断 进行网络通信操作。 // service 里面为了避免多个线程浪费 我开启了一个线程池,大小为3个估计是够了。然后用阻塞队列控制。LinkedBlockingQueue.
sagittarius1988 2014-08-01
  • 打赏
  • 举报
回复
引用 24 楼 heaimnmn 的回复:
引用 23 楼 sagittarius1988 的回复:
[quote=引用 21 楼 heaimnmn 的回复:] [quote=引用 12 楼 sagittarius1988 的回复:] 网络请求的是否可以统一在一个网络请求类管理呢?需要时,只需传入参数和回调,请求好后,在回调中获取
问题json是会改变的,所以无法统一管理,这点让我很蛋疼,,,
直接都是用个jsonObject啊[/quote]不,我意思的是在启动这个MainActivity的时候才会得到json,才能访问网络,并不能之前访问的呗,传jsonObject倒是一个好主意,只不过还是多次访问网络了,,,[/quote] 这个json保存到application里,然后fragment里请求网络,json没保存的时候请求,已经保存过了,直接get这个json
IT_木头 2014-08-01
  • 打赏
  • 举报
回复
顶一个,,楼主很厉害的样子...,小弟是来混分的.....
哎,真难 2014-08-01
  • 打赏
  • 举报
回复
引用 16 楼 han1202012 的回复:
[quote=引用 1 楼 heaimnmn 的回复:] 两百分都给我沉下去了,不要嘛,大家说下自己的想法就OK,思路也行我看看可以实践不,,,
一颗星 多少分 能有星星 [/quote]5000分呗,您已经快有了,,,
哎,真难 2014-08-01
  • 打赏
  • 举报
回复
引用 23 楼 sagittarius1988 的回复:
引用 21 楼 heaimnmn 的回复:
[quote=引用 12 楼 sagittarius1988 的回复:] 网络请求的是否可以统一在一个网络请求类管理呢?需要时,只需传入参数和回调,请求好后,在回调中获取
问题json是会改变的,所以无法统一管理,这点让我很蛋疼,,,
直接都是用个jsonObject啊[/quote]不,我意思的是在启动这个MainActivity的时候才会得到json,才能访问网络,并不能之前访问的呗,传jsonObject倒是一个好主意,只不过还是多次访问网络了,,,
昵__称 2014-08-01
  • 打赏
  • 举报
回复
引用 7 楼 heaimnmn 的回复:
引用 4 楼 u014387289 的回复:
[quote=引用 3 楼 heaimnmn 的回复:] [quote=引用 2 楼 u014387289 的回复:] 如果fragment的数据都不一样,请求N次有什么问题?
但是可以在MainActivity里面一次性请求好,何必再重复请求了,,,
可以考虑在new fragment的时候设置给他[/quote]不懂你的意思,fragment一开始在oncreate就是就要生成了,怎么再去new了,,,[/quote] 我其实不是很清楚你的界面,我用fragment不是很多,只在和viewpager一起用过。 使用fragment都是new fragment,在activity的oncreate时请求数据,一个菊花转,获得数据后再给fragment设置数据在fragment里面都有一个setData方法
sagittarius1988 2014-08-01
  • 打赏
  • 举报
回复
引用 21 楼 heaimnmn 的回复:
引用 12 楼 sagittarius1988 的回复:
网络请求的是否可以统一在一个网络请求类管理呢?需要时,只需传入参数和回调,请求好后,在回调中获取
问题json是会改变的,所以无法统一管理,这点让我很蛋疼,,,
直接都是用个jsonObject啊
哎,真难 2014-08-01
  • 打赏
  • 举报
回复
引用 17 楼 hjywyj 的回复:
这是我以前写的一个简化版的BaseFragment,至于异步获取,本菜觉得放哪无所谓吧,可能我没明白lz的意思。直接在Activity中获取数据,更新Fragment可以,或者在BaseFragment中加个abstract Update 方法,在异步获取之后调用Update也可以。


package Fragment;

import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.example.cs.MyApplication;
import com.google.gson.Gson;
import java.lang.reflect.Field;

public abstract class BaseFragment extends Fragment{
    protected View view;//Fragment  layout  最外层  View
    protected Context context = MyApplication.getApplication();
    protected final static Gson gson = new Gson();//用来解析json用
    protected String json_str;//传递的json字符串
    protected static final String json_key = "json";
    boolean should_new_newview = true;

    public BaseFragment() {
        themeob.addObserver(this);
    }

	//这个方法可以在Activity中直接获取Fragment的View
    public final View findViewById(int id) {
        return view.findViewById(id);
    }

    public final View getView() {
        return view;
    }

    @Override
    public final View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        if (view == null || should_new_newview)
        {
            view = monCreateView(inflater, container, savedInstanceState);
        }
        return view;
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        should_new_newview = true;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        themeob.deleteObserver(this);
    }
//调用此方法更新保存的数据
    public final void msetArguments(Bundle bundle) {
        try {
            Field mArguments_field = getClass().getDeclaredField("mArguments");
            mArguments_field.setAccessible(true);
            mArguments_field.set(this, bundle);
        } catch (Exception e) {
        }
    }

    public abstract View monCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState);
}

大神,update是否可以重新更新界面view,但是好像用户体验性不好,比如你进入一个fragment,显示了一个默认的界面,过了一会数据更新好了,又显示一个新的界面,,,
哎,真难 2014-08-01
  • 打赏
  • 举报
回复
引用 12 楼 sagittarius1988 的回复:
网络请求的是否可以统一在一个网络请求类管理呢?需要时,只需传入参数和回调,请求好后,在回调中获取
问题json是会改变的,所以无法统一管理,这点让我很蛋疼,,,
哎,真难 2014-08-01
  • 打赏
  • 举报
回复
引用 11 楼 birdsaction 的回复:
不知道理解可对: 在Fragment可以提前初始化 onCreateView()这个方法 onCreateView(){ //此时还没有数据,所以显示 数据正在加载中 showLoadingView()吧 return view; } public void onUpdateView(JSONDATA data){ //现在UI线程中更新 之前Fragment还在显示loadingView, } class MainActivity { //activty中做异步请求数据,如果请求成功 调用 Fragment中自己写的onUpdateView()方法. } //但我到喜欢把网络数据请求都写在service里面,然后网络获取数据结果通过广播回调 Intent intent = new Intent(this,MyService.class); //这个Service 就是专门请求网络数据的。 intent.putString("reqURL",myURL); intent.putString("params",params); startService(intent); 在onStartCommand() 里面通过判断 进行网络通信操作。 // service 里面为了避免多个线程浪费 我开启了一个线程池,大小为3个估计是够了。然后用阻塞队列控制。LinkedBlockingQueue.
这个主意不错,先不加载view,先显示等待画面,,,
马甲大王 2014-08-01
  • 打赏
  • 举报
回复
fragment依附在ativity中?那么activity就拥有fragment的实例,然后在activity中请求,然后用那个实例更新界面
顾小林 2014-08-01
  • 打赏
  • 举报
回复
不知道是否理解对了你的意思,你的网络请求的那次数据都是一样的,那样的话你在第一个fragment 请求到数据的时候直接将数据放到一个 静态变量好了。然后 每个fragment oncreate的时候先判断 是否有这个值,没有就请求,有就不用管好了。
加载更多回复(12)

80,349

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧