編輯:關於android開發
【BaseFragment】:
public abstract class BaseFragment extends Fragment {
/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
private LoadingPage loadingPage;
private ViewGroup container;
public boolean isInViewPager=false;//繼承的Fragment是否存在於ViewPager中
//默認為false,如果fragment不是在viewpager中它的setUserVisibleHint方法不會執行,默認不可見
/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
private int isLoad=0;//是否已經加載過
private boolean isVisable;//是否可見
/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle
savedInstanceState) {
this.container=container;
loadingPage=updateLoadingPage();
return loadingPage;
}
/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
public LoadingPage updateLoadingPage(){
loadingPage=new LoadingPage(container.getContext()) {
@Override
public int getMyLayoutId() {
return getLayoutId();
}
@Override
public RequestParams getMyParams() {
return getParams();
}
@Override
public String getMyUrl() {
//如果Fragment不在ViewPager裡,直接返回url
if(!isInViewPager){
return getUrl();
}
//如果Fragment在ViewPager裡,需要分情況考慮
if(TextUtils.isEmpty(getUrl())){//本身就不需要聯網
isLoad=1;
return getUrl();
}else{
if(isVisable){//需要聯網,可見
isLoad=2;
return getUrl();
}else{//需要聯網,不可見
isLoad=3;
return null;
}
}
}
@Override
public void onMySuccess(ReSultState reSultState, View successView) {
ButterKnife.bind(BaseFragment.this, successView);//綁定操作,第1個參數注意不能為this
initTitle();
initData(reSultState.getContent());
}
};
return loadingPage;
}
/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
showLodingPage();
//為什麼不直接寫loadingPage.show()而要用方法showLodingPage()封裝這句代碼?
//因為showLodingPage()方法,可以使得BaseFragment的繼承者都可以調用
//homeFragment=new HomeFragment();不會調用BaseFragment的onCreateView方法
//在commit()之後,Fragment的生命周期onCreateView才會執行
}
/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
public void showLodingPage(){
loadingPage.show();//聯網操作——>改變聯網狀態——>替換掉正在加載的頁面
//模擬聯網耗時操作,正常情況下用上面這句代碼即可
// UIUtils.getHandler().postDelayed(new Runnable() {
// @Override
// public void run() {
// loadingPage.show();
// }
// },2000);
//還可以在LoadingPage的show()方法模擬聯網耗時操作
}
/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
@Override
public void onDestroyView() {
super.onDestroyView();
ButterKnife.unbind(this);
}
/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
public abstract RequestParams getParams();
public abstract String getUrl();
public abstract int getLayoutId();
public abstract void initTitle();
public abstract void initData(String content);
/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
//處理ViewPager的每頁是繼承於BaseFragment的Fragment,預加載的情況
//最終實現的目標:取消ViewPager的預加載+緩存所有加載過的
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
isVisable=isVisibleToUser;
if(isInViewPager && isVisibleToUser && isLoad==3){
loadingPage.show();//這時候loadingPage一定不為null,因為isLoad==3表示已經初始化過
}
}
/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
}
【LoadingPage】:
public abstract class LoadingPage extends FrameLayout {
/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
private Context mContext;
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_SUCESS=4;
public int state_current=STATE_LOADING;
private View loadingView;
private View errorView;
private View emptyView;
private View successView;
private LayoutParams params;
/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
public LoadingPage(Context context) {
this(context, null);
}
public LoadingPage(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public LoadingPage(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.mContext=context;
init();
}
/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
private void init() {
params=new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
if(loadingView==null){
loadingView= UIUtils.getXmlView(R.layout.page_loading);
addView(loadingView,params);
}
if(errorView==null){
errorView= UIUtils.getXmlView(R.layout.page_error);
addView(errorView);
}
if(emptyView==null){
emptyView= UIUtils.getXmlView(R.layout.page_empty);
addView(emptyView);
}
showSafePage();
}
/**
* 保證View的顯示在主線程中執行
*/
private void showSafePage() {
UIUtils.runOnUiThread(new Runnable() {
@Override
public void run() {
showPage();
}
});
}
private void showPage() {
loadingView.setVisibility(state_current==STATE_LOADING?VISIBLE:GONE);
errorView.setVisibility(state_current==STATE_ERROR?VISIBLE:GONE);
emptyView.setVisibility(state_current==STATE_EMPTY?VISIBLE:GONE);
if(successView==null){
successView=View.inflate(mContext,getMyLayoutId(),null);//Context:使用Fragment依賴的Activity實例
addView(successView,params);
}
successView.setVisibility(state_current==STATE_SUCESS?VISIBLE:GONE);
}
/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
private AsyncHttpClient client=new AsyncHttpClient();//聯網工具
private ReSultState reSultState;//封裝聯網狀態和數據的對象
public void show(){
//處理有些Fragment本身就不需要聯網請求數據的情況,即該Fragment重寫的getUrl方法直接return null
String url=getMyUrl();
if(TextUtils.isEmpty(url)){
state_current=STATE_SUCESS;
reSultState=ReSultState.SUCCESS;
reSultState.setContent("");
//這裡將content設為"",那麼在比如HomeFragment的initData一定要判斷content是否為空
loadPage();
return;
}
//處理有些Fragment需要聯網請求數據的情況,這時候該Fragment的getUrl()返回的是一個url
Runnable runnable=new Runnable() {
@Override
public void run() {
/*-------------------------------------------------------------------*/
//正常情況下的代碼
AsyncHttpResponseHandler responseHandler=new AsyncHttpResponseHandler(){
@Override
public void onSuccess(String content) {//聯網請求數據成功
//content="";//模擬請求數據為空
if(TextUtils.isEmpty(content)){
reSultState=ReSultState.EMPTY;
reSultState.setContent("");
}else{
reSultState=ReSultState.SUCCESS;
reSultState.setContent(content);
}
loadPage();
}
@Override
public void onFailure(Throwable error, String content) {//聯網請求數據失敗
reSultState=ReSultState.ERROR;
reSultState.setContent("");
loadPage();
}
};
client.get(getMyUrl(),getMyParams(),responseHandler);//getMyUrl(),getMyParams()由BaseFragment實現
/*-------------------------------------------------------------------*/
}
};
UIUtils.getHandler().post(runnable);
//UIUtils.getHandler().postDelayed(runnable, 2000);//模擬延時2秒,正常代碼沒有這個
}
/**
* 根據resultState的狀態和數據,更新當前加載狀態state_current,如果是聯網請求成功還需要
* 調用抽象方法onSuccess(resultState,content),在BaseFragment會實現這個抽象方法,
* 從而根據聯網成功的數據加載頁面
*/
private void loadPage() {
switch (reSultState) {
case SUCCESS:
state_current=STATE_SUCESS;
break;
case ERROR:
state_current=STATE_ERROR;
break;
case EMPTY:
state_current=STATE_EMPTY;
break;
}
showSafePage();
if(state_current==STATE_SUCESS){
onMySuccess(reSultState,successView);
}
}
/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
/**
* 封裝聯網狀態和請求結果的枚舉類
*/
public enum ReSultState{
ERROR(2),EMPTY(3),SUCCESS(4);
private int state;
private String content;
ReSultState(int state) {
this.state=state;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
// 抽象方法
public abstract int getMyLayoutId();
public abstract RequestParams getMyParams();
public abstract String getMyUrl();
public abstract void onMySuccess(ReSultState reSultState,View successView);
/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
}
記一次流量異常處理前兩天接到一個做開發的朋友電話,說他們客戶一台服務器開機後,所有一個網段的機器上網都變慢了,他遠程操作這台服務器也一卡一卡的。我第一反應就是機器被人攻擊
以前曾經地介紹過MediaPlayer的基本用法,這裡就深入地講解MediaPlayer的在線播放
Android Studio教程--從Github 下載一個Repository,androidgithub從電腦上徹底刪除HelloWorld項目 回到as歡迎頁面
Android開發的初學者快速創建一個項目,android開發初學者因為gwf的原因,大陸連不上google所以AndroidSDK是無法更新的 而且設置代