这里需要利用几个别人已经封装好的java请求网络数据的类来实现,更快一些HttpClientFactory.java,HttpHelper.java,和HttpRetry.java
利用HomeFragment的abstart方法load()来请求数据,load方法实在BaseFragment.java中申明的
HomeFragment.java
package com.ldw.market.fragment;
import com.ldw.market.R;
import com.ldw.market.fragment.BaseFragment.LoadResult;
import com.ldw.market.protocol.HomeProtocal;
import com.ldw.market.utils.ViewUtils;
import android.os.Bundle;
import android.os.SystemClock;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.FrameLayout.LayoutParams;
import android.widget.TextView;
/*
* Home页面,主体的加载的几个页面和服务器请求数据都是在BaseFragment中去实现
*/
public class HomeFragment extends BaseFragment {
// 当Fragment挂载的activity创建的时候调用
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
show();
}
public View createSuccessView() {
TextView tv = new TextView(getActivity());
tv.setText("加载成功了....");
tv.setTextSize(30);
return tv;
}
@Override
public LoadResult load() {
HomeProtocal protocol = new HomeProtocal();
protocol.load(0);
return LoadResult.success;
}
}
HomeProtocal.java来实现向网络请求数据,首先看本地是否有数据,有数据就从本地加载,没有就向服务器发送数据请求,然后保存在本地,之后开始解析json数据
package com.ldw.market.protocol;
import com.ldw.market.http.HttpHelper;
import com.ldw.market.http.HttpHelper.HttpResult;
import com.lidroid.xutils.HttpUtils;
import com.lidroid.xutils.exception.HttpException;
import com.lidroid.xutils.http.ResponseStream;
import com.lidroid.xutils.http.client.HttpRequest.HttpMethod;
public class HomeProtocal {
//请求服务器数据,参数index,可以分批加载
public void load(int index){
//从本地请求数据
String json = loadLocal(index);
//返回的数据是json
if(json == null){
json = loadServer(index);
//保存到本地
if(json != null){
saveLocal(json, index);
}
}
//json不为空,就解析json
if(json != null){
parseJson(json);
}
}
//解析json数据
private void parseJson(String json) {
// TODO Auto-generated method stub
}
//将json保存在本地
private void saveLocal(String json, int index) {
// TODO Auto-generated method stub
}
//从服务器请求json数据
private String loadServer(int index) {
//请求地址http://127.0.0.1:8090/home?index=1
HttpResult httpResult = HttpHelper.get(HttpHelper.URL +"home"
+ "?index=" + index);
//得到结果
String json = httpResult.getString();
System.out.println(json);
return json;
}
//加载本地保存的数据
private String loadLocal(int index) {
// TODO Auto-generated method stub
return null;
}
}
BaseFragment.java
package com.ldw.market.fragment;
import com.ldw.market.R;
import com.ldw.market.manager.ThreadManager;
import com.ldw.market.utils.ViewUtils;
import android.os.Bundle;
import android.os.SystemClock;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.FrameLayout.LayoutParams;
public abstract class BaseFragment extends Fragment {
//初始化页面加载的5种状态
public static final int STATE_UNKOWN = 0;
public static final int STATE_LOADING = 1;
public static final int STATE_ERROR = 2;
public static final int STATE_EMPTY = 3;
public static final int STATE_SUCCESS = 4;
public int state = STATE_UNKOWN;
private View loadingView;// 加载中的界面
private View errorView;// 错误界面
private View emptyView;// 空界面
private View successView;// 加载成功的界面
private FrameLayout frameLayout;
//创建一个View对象
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if(frameLayout == null){
frameLayout = new FrameLayout(getActivity());
init(); // 在FrameLayout中 添加4种不同的界面:加载中, 加载错误,加载为空 ,加载成功
}else{
ViewUtils.removeParent(frameLayout);
}
//show();// 根据服务器的数据 切换状态
return frameLayout;
}
// 在FrameLayout中 添加4种不同的界面:加载中, 加载错误,加载为空 ,加载成功
private void init() {
// 创建了加载中的界面
loadingView = createLoadingView();
if (loadingView != null) {
frameLayout.addView(loadingView, new FrameLayout.LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
}
// 加载错误界面
errorView = createErrorView();
if (errorView != null) {
frameLayout.addView(errorView, new FrameLayout.LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
}
// 加载空的界面
emptyView = createEmptyView();
if (emptyView != null) {
frameLayout.addView(emptyView, new FrameLayout.LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
}
// 根据不同的状态显示不同的界面
showPage();
}
//根据不同的状态显示不同的界面
private void showPage(){
//利用||,显示加载界面
if (loadingView != null) {
loadingView.setVisibility(state == STATE_UNKOWN
|| state == STATE_LOADING ? View.VISIBLE : View.INVISIBLE);
}
//利用||,显示错误界面
if (errorView != null) {
errorView.setVisibility(state == STATE_ERROR ? View.VISIBLE
: View.INVISIBLE);
}
//利用||,显示空界面
if (emptyView != null) {
emptyView.setVisibility(state == STATE_EMPTY ? View.VISIBLE
: View.INVISIBLE);
}
if (state == STATE_SUCCESS) {
//创建成功的时候加载成功页面
successView = createSuccessView();
if (successView != null) {
frameLayout.addView(successView, new FrameLayout.LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
successView.setVisibility(View.VISIBLE);
}
}else{
//不成功的时候让页面隐藏
if(successView != null){
successView.setVisibility(View.INVISIBLE);
}
}
}
//加载成功的界面
public abstract View createSuccessView();
/* 创建加载中的界面 */
private View createErrorView() {
View view = View.inflate(getActivity(), R.layout.loadpage_error, null);
//点击按钮重新请求服务器更新界面
Button page_bt = (Button) view.findViewById(R.id.page_bt);
page_bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
show();
}
});
return view;
}
/* 加载错误界面 */
private View createEmptyView() {
View view = View.inflate(getActivity(), R.layout.loadpage_empty, null);
return view;
}
/* 加载空的界面 */
private View createLoadingView() {
View view = View.inflate(getActivity(), R.layout.loadpage_loading, null);
return view;
}
//更具服务器获取的状态显示界面
public void show() {
//更新状态,当加载错误以后或者加载了空页面时候需要更新一下状态
if (state == STATE_ERROR || state == STATE_EMPTY) {
state = STATE_LOADING;
}
// 请求服务器 获取服务器上数据 进行判断
// 请求服务器 返回一个结果
//子线程中请求服务器,同时休眠一下
//使用线程池管理
ThreadManager.getInstance().createLongPool().execute(new Runnable(){
@Override
public void run() {
//休眠2s
SystemClock.sleep(2000);
final LoadResult result = load();
//主线程刷新界面
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
if(result != null){
//更新状态
state = result.getValue();
//更新界面
showPage();
}
}
});
}
});
showPage();
}
//服务器返回的数据
protected abstract LoadResult load();
//服务器返回的枚举结果,来显示界面
public enum LoadResult{
error(2), empty(3), success(4);
int value;
//获取服务器返回的结果
LoadResult(int value) {
this.value = value;
}
//获取到value
public int getValue() {
return value;
}
}
}