来,和大家探讨个有关问题,activity和fragment异步传输数据的有关问题
来,和大家探讨个问题,activity和fragment异步传输数据的问题
发个讨论帖,最近发现以前写的代码有点傻逼,想改进下,需求是这样的:
进入MainActivity,会启动异步线程访问网络,把获得到数据给fragment显示出来,看起来很简单,其实内在有个通行机制逻辑,让我很困惑。
因为进入MainActivity的时候,之前的Activity会传入一个JSONString过来,你要在把这个JSONString给POST到服务器才能返回值,但是根据activity和fragment的生命周期,你不可能在MainActivity里面启动异步线程访问网络,获取得到值以后再去传值给fragment,因为fragment已经oncreateview了。
以前傻逼的方法就是在生成fragment的时候,把JSONstring放到bundler里面传到fragment里面,再从fragment里面访问网络,获得数据。但是有N个fragment的时候就要访问网络N次了。
所以想和大家讨论下activity和fragment异步传输数据的方法,有没有其它更好的方法实现这种回调,,,
PS:最近处于待业状态,忙得很,邀请回帖的别介意我没回复,别邀请了还发私信,,,
------解决方案--------------------
如果fragment的数据都不一样,请求N次有什么问题?
------解决方案--------------------
可以考虑在new fragment的时候设置给他
------解决方案--------------------
activity和fragment是独立的,activity可以用异步线程去做些事情的,你可以看下SyncTask类。
------解决方案--------------------
我其实不是很清楚你的界面,我用fragment不是很多,只在和viewpager一起用过。
使用fragment都是new fragment,在activity的oncreate时请求数据,一个菊花转,获得数据后再给fragment设置数据在fragment里面都有一个setData方法
------解决方案--------------------
顶一个,,楼主很厉害的样子...,小弟是来混分的.....
------解决方案--------------------
不知道理解可对:
在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.
------解决方案--------------------
网络请求的是否可以统一在一个网络请求类管理呢?需要时,只需传入参数和回调,请求好后,在回调中获取
------解决方案--------------------
是activity 先创建 后再oncreateView的吧。。
------解决方案--------------------
楼主,建议你网络或耗时操作,都放到新的线程中处理。
处理完后通知界面分两种方式:一,尝试postInvalidate;二,保存标志位到数据库或文件中。
一:把view的引用传入后台线程,网络操作完毕后view.postInvalidate()来通知更新。这时候view可能已经不存在了,要注意catch exception,另外考虑加上下面的第二种方法。
二:保存view需刷新的标志到数据库或文件中,每次view重绘的时候,检查一下标识看看是否有新数据,有则加载。
------解决方案--------------------
1.getSupportFragmentManager().findFragmentById/ByTag
2.MainActivty里面放个list当fragment初始化后添加到list,网络请求返回数据后取出调用fragment方法刷新
------解决方案--------------------
一颗星 多少分 能有星星
------解决方案--------------------
这是我以前写的一个简化版的BaseFragment,至于异步获取,本菜觉得放哪无所谓吧,可能我没明白lz的意思。直接在Activity中获取数据,更新Fragment可以,或者在BaseFragment中加个abstract Update 方法,在异步获取之后调用Update也可以。
发个讨论帖,最近发现以前写的代码有点傻逼,想改进下,需求是这样的:
进入MainActivity,会启动异步线程访问网络,把获得到数据给fragment显示出来,看起来很简单,其实内在有个通行机制逻辑,让我很困惑。
因为进入MainActivity的时候,之前的Activity会传入一个JSONString过来,你要在把这个JSONString给POST到服务器才能返回值,但是根据activity和fragment的生命周期,你不可能在MainActivity里面启动异步线程访问网络,获取得到值以后再去传值给fragment,因为fragment已经oncreateview了。
以前傻逼的方法就是在生成fragment的时候,把JSONstring放到bundler里面传到fragment里面,再从fragment里面访问网络,获得数据。但是有N个fragment的时候就要访问网络N次了。
所以想和大家讨论下activity和fragment异步传输数据的方法,有没有其它更好的方法实现这种回调,,,
PS:最近处于待业状态,忙得很,邀请回帖的别介意我没回复,别邀请了还发私信,,,
------解决方案--------------------
如果fragment的数据都不一样,请求N次有什么问题?
------解决方案--------------------
可以考虑在new fragment的时候设置给他
------解决方案--------------------
activity和fragment是独立的,activity可以用异步线程去做些事情的,你可以看下SyncTask类。
------解决方案--------------------
不懂你的意思,fragment一开始在oncreate就是就要生成了,怎么再去new了,,, 但是可以在MainActivity里面一次性请求好,何必再重复请求了,,,
如果fragment的数据都不一样,请求N次有什么问题?
可以考虑在new fragment的时候设置给他![]()
我其实不是很清楚你的界面,我用fragment不是很多,只在和viewpager一起用过。
使用fragment都是new fragment,在activity的oncreate时请求数据,一个菊花转,获得数据后再给fragment设置数据在fragment里面都有一个setData方法
------解决方案--------------------
顶一个,,楼主很厉害的样子...,小弟是来混分的.....
------解决方案--------------------
不知道理解可对:
在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.
------解决方案--------------------
网络请求的是否可以统一在一个网络请求类管理呢?需要时,只需传入参数和回调,请求好后,在回调中获取
------解决方案--------------------
是activity 先创建 后再oncreateView的吧。。
------解决方案--------------------
楼主,建议你网络或耗时操作,都放到新的线程中处理。
处理完后通知界面分两种方式:一,尝试postInvalidate;二,保存标志位到数据库或文件中。
一:把view的引用传入后台线程,网络操作完毕后view.postInvalidate()来通知更新。这时候view可能已经不存在了,要注意catch exception,另外考虑加上下面的第二种方法。
二:保存view需刷新的标志到数据库或文件中,每次view重绘的时候,检查一下标识看看是否有新数据,有则加载。
------解决方案--------------------
1.getSupportFragmentManager().findFragmentById/ByTag
2.MainActivty里面放个list当fragment初始化后添加到list,网络请求返回数据后取出调用fragment方法刷新
------解决方案--------------------
两百分都给我沉下去了,不要嘛,大家说下自己的想法就OK,思路也行我看看可以实践不,,,
------解决方案--------------------
这是我以前写的一个简化版的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);
}