編輯:關於Android編程
為了提高代碼的封裝性及可讀性,我把原來手懶搞的一些AsyncTask的繼承內部類決定都單獨拉到一個文件夾中,但這一拉,出事情了!
我的應用業務是,有一個min_question_id(int )來記錄目前讀取到的服務器端數據,原來是內部類的時候,用的好好的,這把它單獨剝離出來,每次拉取數據卻是從頭拉取了!
好了,先上原來的代碼!
public class getQuestionListDataTask extends AsyncTask{ private static final int GETREFRESUCCESS=5000; private static final int GETREQUESTERROR=5001; private static final int DATASETEMPTY=5002; PullToRefreshListView mPullToRefreshLayout; List > listItemQuestion; boolean isFirstEnter; int min_question_id; QuestionListAdapter mQuestionListAdapter; /* * mpPullToRefreshListView:異步刷新工作對應的PullToRefreshListView * mList:PullToRefreshListView對應的後台數據引用 * isfirstEnter:記錄是否第一次開機後第一次進入app * min_question_id:獲取問題列表時候的最小id * mQuestionListAdapter:驅動mpPullToRefreshListView的適配器 */ public getQuestionListDataTask(PullToRefreshListView mPullToRefreshListView,List > mList, booleanisfirstEnter,int min_question_id,QuestionListAdapter mQuestionListAdapter) { super(); this.mPullToRefreshLayout=mPullToRefreshListView; this.listItemQuestion=mList; this.isFirstEnter=isfirstEnter; this.min_question_id=min_question_id; this.mQuestionListAdapter=mQuestionListAdapter; } @Override protected Void doInBackground(Void... arg0) { // TODO Auto-generated method stub if(mPullToRefreshLayout.isHeaderShown()) { listItemQuestion.clear(); getQuestionListData(0, true); isFirstEnter=false; } if(mPullToRefreshLayout.isFooterShown()) { getQuestionListData(min_question_id,false); } else { listItemQuestion.clear(); getQuestionListData(0, true); //getHttpData(min_question_id,false); } return null; } @Override protected void onPostExecute(Void result) { // TODO Auto-generated method stub mQuestionListAdapter.notifyDataSetChanged(); mPullToRefreshLayout.onRefreshComplete(); super.onPostExecute(result); }
}裡面的getQuesionListData是一個拉取網絡數據的接口,由於大家都懂的的原因,我就不貼出來啦~~我的要求是每一次拉取完數據(實例化一次getQuesionListDataTask並執行),都在getQuesionListData更新min_question_id的值。
顯然,數據每次都還從頭拉的原因就是這個min_question_id並沒有得到更新!
java的傳遞不是值傳遞嗎?!
是嗎?!不是,這只是我的一個誤區。
①基本類型變量,包括char、byte、short、int、long、float、double、boolean 。
②非基本變量。
而非基本變量是引用傳遞,基本變量是值傳遞!
那怎麼辦呢?難道我們要把char、byte、short、int、long、float、double、boolean這些東西自己寫個wrapper把它們wrap成類?卻是是這樣的!但是我們不用自己寫,java自身就帶有這些包,就是這些基本類型的包裝類!
分別和上面基本變量類型對應的是:Character,Byte,Short,Integer,Long,Float,Double,Boolean。
而且支持自動wrap/unwrap,媽媽再也不用擔心我的手指了!
這樣,我們就可以在需要在函數或類內部改變基本變量的值時,將其裡面和外面的基本類型變量類型都改為包裝類名~
於是,我現在的代碼是這樣的:
外部類:
public class AskFragment extends Fragment implements OnClickListener { private static Boolean isFirstEnter=true; private Integer min_question_id=1000; private ListgetQuestionListDataTask是這樣的:> listItemQuestion = new ArrayList >(); private View rootView; private View headerView; private ImageButton mSearchButton,mAddButton,headPicButton; private PullToRefreshListView mPullToRefreshLayout; QuestionListAdapter mQuestionListAdapter; public void onActivityCreated(Bundle savedInstanceState) { new getQuestionListDataTask(mPullToRefreshLayout, listItemQuestion, isFirstEnter, min_question_id, mQuestionListAdapter).execute(); } } }
public class getQuestionListDataTask extends AsyncTask{ private static final int GETREFRESUCCESS=5000; private static final int GETREQUESTERROR=5001; private static final int DATASETEMPTY=5002; PullToRefreshListView mPullToRefreshLayout; List > listItemQuestion; Boolean isFirstEnter; Integer min_question_id; QuestionListAdapter mQuestionListAdapter; /* * mpPullToRefreshListView:異步刷新工作對應的PullToRefreshListView * mList:PullToRefreshListView對應的後台數據引用 * isfirstEnter:記錄是否第一次開機後第一次進入app * min_question_id:獲取問題列表時候的最小id * mQuestionListAdapter:驅動mpPullToRefreshListView的適配器 */ public getQuestionListDataTask(PullToRefreshListView mPullToRefreshListView,List > mList, Boolean isfirstEnter,Integer min_question_id,QuestionListAdapter mQuestionListAdapter) { super(); this.mPullToRefreshLayout=mPullToRefreshListView; this.listItemQuestion=mList; this.isFirstEnter=isfirstEnter; this.min_question_id=min_question_id; this.mQuestionListAdapter=mQuestionListAdapter; } @Override protected Void doInBackground(Void... arg0) { // TODO Auto-generated method stub if(mPullToRefreshLayout.isHeaderShown()) { listItemQuestion.clear(); getQuestionListData(0, true); isFirstEnter=false; } if(mPullToRefreshLayout.isFooterShown()) { getQuestionListData(min_question_id,false); } else { listItemQuestion.clear(); getQuestionListData(0, true); //getHttpData(min_question_id,false); } return null; } @Override protected void onPostExecute(Void result) { // TODO Auto-generated method stub mQuestionListAdapter.notifyDataSetChanged(); mPullToRefreshLayout.onRefreshComplete(); super.onPostExecute(result); }
}就這樣就搞定了,有木有!列表正常顯示了!
說明:由於只是示例作用,代碼截自我的項目,很多東西刪去了,也有的變量沒初始化,但大家不要介意這些細節~
前言昨日,公司討論用什麼工具來統計Crash信息時,有提出友盟,TalkingData,Crashlytics等等工具。鑒於之前其他兄弟部門有使用Crashlytics和
一、前言 本篇blog是我的“Android進階”的第一篇文章,從初學Android到現在斷斷續續也有4個多月時間了,也算是有了一些自己的心得體會,也能自
要做這種效果1- 整個自定義控件其實就是一個ArcMenu .(半圓形那一圈),左下角的圖標沒有加入進控件中。 2- 我基於他的類改了點。他是將左下角的關閉ic
我們知道很多apk光是靜態調試時遠遠滿足不了我們對apk的分析,這個時候,我們就需要來一波靜態調試。此處為個人筆記,也為入門小白引路,這裡就不看結果了,主要是教大家怎麼結