android項目總結
以下各個包,並總結下學習過的東西(主要是怕忘了):
com.joker
com.joker.action
com.joker.adapter
com.joker.graphs
com.joker.info
com.joker.model
com.joker.myview
com.joker.net
com.joker.splash
com.joker.thread
com.joker.utils
com.joker
主體包,view層,主體界面層
JokerMainActivity
這個部分主要工作是初始化主界面的各個模塊部分,包括界面頂端欄目切換部分,4個欄目的fragment初始化,菜單部分各個按鈕的監聽,各個欄目切換的按鈕監聽,根據不同用戶角色顯示不同的菜單選項判斷,初始化朗讀人聲音效按鈕列表,設置雙擊退出應用。其中,最主要的就是界面滑動部分,主要代碼如下:
private FragmentViewPagerAdapter adapter;
// 分類欄和指示器
private JokerIndexContainer mTitleView;
// 此處設置子屏幕的初始化
mViewPager = (ViewPager) findViewById(R.id.id_viewpager);
mTitleView.mJokes1NewestTextView = (TextView) findViewById(R.id.id_tv_jokes_newest);
mTitleView.mJokes3WordTextView = (TextView) findViewById(R.id.id_tv_jokes_word);
mTitleView.mJokes2BestTextView = (TextView) findViewById(R.id.id_tv_jokes_best);
mTitleView.mJokes4AudioTextView = (TextView) findViewById(R.id.id_tv_jokes_audio);
// 將四個子頁視圖放入到數組中
mDatas = new ArrayList<Fragment>();
Jokes1NewestMainListFragment tab01 = new Jokes1NewestMainListFragment();
Jokes2BestMainListFragment tab02 = new Jokes2BestMainListFragment();
Jokes3WordMainListFragment tab03 = new Jokes3WordMainListFragment();
Jokes4AudioMainListFragment tab04 = new Jokes4AudioMainListFragment();
mDatas.add(tab01);
mDatas.add(tab02);
mDatas.add(tab03);
mDatas.add(tab04);
// 設置適配器
adapter = new FragmentViewPagerAdapter(mTitleView,this.getSupportFragmentManager(), mViewPager, mDatas);
JokerIndexContainer
如註釋所說,把分類欄的內容抽取成一個類,方便消息傳遞,代碼如下:
// @說明 把分類欄的內容抽取成一個類,使得內容便於傳遞
public class JokerIndexContainer {
public TextView mJokes1NewestTextView;// 分類欄“最新”文本視圖
public TextView mJokes3WordTextView;// 分類欄“純文”文本視圖
public TextView mJokes2BestTextView;// 分類欄“最贊”文本視圖
public TextView mJokes4AudioTextView;// 分類欄“語音”文本視圖
public ImageView mTabline;
public int mScreen1_4;
JokerIndexContainer(Context ctx) {
mJokes1NewestTextView = new TextView(ctx);
mJokes3WordTextView = new TextView(ctx);
mJokes2BestTextView = new TextView(ctx);
mJokes4AudioTextView = new TextView(ctx);
mTabline = new ImageView(ctx);
}
}
Jokes1NewestMainListFragment(其中一個頁面)
此示例頁面就是主要顯示最新的笑話的頁面的一個fragment,類繼承Fragment。
//動態加入listview
mLinearLayout = (LinearLayout)view.findViewById(R.id.HomeGroup);
myListView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT));
myListView.setDivider(null);
mLinearLayout.addView(myListView);
//這是網絡連接的代碼,安裝規定好的格式傳輸,獲取定量的笑話條數
url = Model.NEWJOKE;
ListBottem.setVisibility(View.GONE);
start = 0;
ThreadPoolUtils.execute(new HttpGetThread(hand,url+"?start="+start+"&num="+number));
start +=number;
loadflag = false;
//點擊笑話後跳轉到詳情頁
private OnItemClickListener listener =new OnItemClickListener()
{
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3)
{
JokeInfo jokeinfo = (JokeInfo)arg0.getAdapter().getItem(arg2);//Adapter中取出數據
if(!isnet.IsConnect()){
Toast.makeText(ctx, "請先連接網絡", Toast.LENGTH_SHORT).show();
return;
}
Intent intent = new Intent(ctx, JokerSendCommentActivity.class);
Bundle bund = new Bundle();
bund.putSerializable("JokeInfo", list.get(arg2-1));
intent.putExtra("value", bund);
ctx.startActivity(intent);
}
};
com.joker.actions
事務層,包含用戶各種操作邏輯
JokerAuthorityActivity
這個activity是用於Boss管理各個管理員的各式操作,比如同意用戶的管理員申請,撤銷用戶管理員權限,主要代碼如下:
private void adapter(int statu){
if (statu==0) {
//申請管理員界面設置
myAppleAdminAdapter = new MyApplyAdminAdapter(ctx, appleList);
listview.setAdapter(myAppleAdminAdapter);
show.setText("申請管理員");
ThreadPoolUtils.execute(new HttpGetThread(hand, Model.SHOWADMINLIST));
}else if(statu==1){
//撤銷管理員界面設置
myCancleAdminAdapter = new MyCancleAdminAdapter(ctx, cancleList);
listview.setAdapter(myCancleAdminAdapter);
show.setText("撤銷管理員");
ThreadPoolUtils.execute(new HttpGetThread(hand, Model.SHOWADMINLIST));
}
}
//上傳管理員信息在adapter裏的按鈕監聽裏面,詳見MyApplyAdminAdapter,MyCancleAdminAdapter
JokerCheckActivity
這個類主要處理審覈用戶發佈的笑話的管理員操作,如審覈笑話,通過與反對的功能:
ok.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(!isnet.IsConnect()){
Toast.makeText(JokerCheckActivity.this, "請先連接網絡", Toast.LENGTH_SHORT).show();
return;
}
/*解釋下這裏爲什麼兩次網絡連接,因爲到服務器修改用戶管理員標誌完的時候取數據發現還是把之前的用戶信息取過來,數據操作需要時間,就用第二次來取,取除剛操作的用戶數據以外的數據。*/
ThreadPoolUtils.execute(new HttpGetThread(show_handler, Model.CHECKJOKE+"?vid="+jokeid+"&act=pass&uid="+uid));
ThreadPoolUtils.execute(new HttpGetThread(show_handler, Model.CHECKSHOW+"?vid="+jokeid));
ok.setEnabled(false);
no.setEnabled(false);
}
});
//自己定義的showhandler(Handler類)裏接收到none表示沒有需要審覈的笑話了
JokerContributeActivity
這個類主要負責用戶投稿操作,裏面涉及到一些上傳圖片,上傳音頻,錄音,圖片壓縮等一些主要的功能。
// 這個是調用android內置的intent,來過濾圖片文件 ,同時也可以過濾其他的
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_PICK);
intent.setData(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);//設置intent使得在4.4及以上版本不出現圖片選擇器
startActivityForResult(intent, 1);
//錄音的主要代碼,這裏還需要注意的問題是,按下錄音後再反覆點擊會崩潰,需要無效按鈕幾秒防止用戶過於頻繁點擊,也保證錄音長度質量,太頻繁的點擊全都被忽略
time_start=System.currentTimeMillis();
Toast.makeText(JokerContributeActivity.this, "開始錄音啦~", 1000).show();
filename = new Date().getTime() + ".amr";
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile("/sdcard/" + filename);
//發佈笑話部分,用規定好的json格式發送給服務器
int uid = Model.MYUSERINFO.getUserID();// 用戶ID
String xvalue = neirongEdit.getText().toString();// 笑話內容
String ximg = "";// 笑話圖片
String xradio = "";// 笑話音頻
if (!img.equalsIgnoreCase("")) {
ximg = System.currentTimeMillis() + ".png";// 笑話圖片
}
if (!radio.equalsIgnoreCase("")) {
xradio = System.currentTimeMillis() + ".war";// 笑話音頻
}
String Json = "{\"uid\":\"" + uid + "\"," + "\"radio\":\"" + xradio + "\"," + "\"ximg\":\"" + ximg + "\"," + "\"value\":\"" + xvalue + "\"}";
ThreadPoolUtils.execute(new HttpPostThread(handler, Model.CONTRIBUTE, Json, img, radio));
JokerContributeActivity.this.finish();
//在onActivityResult函數裏寫接受用戶點擊圖片後的操作,壓縮圖片到合適的大小方便手機端預覽
Picpath = path;//得到圖片路徑
img = Base64Util.encodeBase64File(Picpath);
DisplayMetrics dm = getResources().getDisplayMetrics();
int w_screen = dm.widthPixels;
int h_screen = dm.heightPixels;//獲取屏幕的長,寬
// 壓縮方法同ImageLoader,計算壓縮比例
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
FileInputStream stream1=new FileInputStream(Picpath);
BitmapFactory.decodeStream(stream1,null,o);
stream1.close();
int w = o.outWidth;
int h = o.outHeight;
// float hh =h_screen;
float ww = w_screen;
//縮放比。由於是固定比例縮放,只用高或者寬其中一個數據進行計算即可
int be = 1;//be=1表示不縮放
if ( w > ww) {//如果寬度大的話根據寬度固定大小縮放,w>h&&w>>ww就要求寬大於高,現在的條件只要寬度大於屏幕就壓縮
be = (int) (o.outWidth / ww);
}
if (be <= 0)
be = 1;
o.inSampleSize = be;//計算縮放比例
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize=be;
FileInputStream stream2=new FileInputStream(Picpath);
Bitmap bitmap=BitmapFactory.decodeStream(stream2,null,o2);
stream2.close();
p_image.setVisibility(View.VISIBLE);
p_image.setAdjustViewBounds(true);// 取消圖片上下方
p_image.setImageBitmap(bitmap);//顯示圖片
JokerLoginActivity
這個就是用戶登錄的主要代碼模塊了,主要就是把用戶的登陸信息上傳驗證,還有跳轉到註冊頁面,找回密碼等小功能。
//登陸方法
private void login() {
url = Model.LOGIN;
value = "{\"name\":\"" + login_username.getText().toString() + "\",\"password\":\"" + login_password.getText().toString() + "\"}";
ThreadPoolUtils.execute(new HttpPostThread(handler, url, value));
}
//說明:handler用於接收子線程發回來的消息
Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
super.handleMessage(msg);
if (msg.what == 404) {
Toast.makeText(JokerLoginActivity.this, "請求失敗,服務器故障", 1).show();
} else if (msg.what == 100) {
Toast.makeText(JokerLoginActivity.this, "服務器無響應", 1).show();
} else if (msg.what == 200) {
String result = msg.obj.toString();
if(result.equals("nopass")){
Toast.makeText(getApplicationContext(), "密碼錯誤",Toast.LENGTH_SHORT).show();
}else if(result.equals("nouser")){
Toast.makeText(getApplicationContext(), "用戶不存在",Toast.LENGTH_SHORT).show();
}else{
if(result!=null){
Toast.makeText(getApplicationContext(), "登陸成功",Toast.LENGTH_SHORT).show();
Model.MYUSERINFO = new MyJson().getUserInfo(result);//標記已登錄
if(autologin.isChecked()){
Editor editor = sharedPreferences.edit();
editor.putString("userName", login_username.getText().toString());
editor.putString("passWord", login_password.getText().toString());
editor.putBoolean("AUTO_ISCHECK", true);
editor.commit();
}
JokerLoginActivity.this.finish(); //會觸發onDestroy();
}
}
}
login.setEnabled(true);
login.setText("登錄");
}
};
JokerPersonalcenterActivity
用戶個人信息管理界面,主要用於申請管理員權限,更新用戶個人信息,還有查看往期發佈的笑話歷史,在此代碼不再贅述。
JokerPushnewsActivity
這個類主要用於發佈通知,使用了新浪的push SDK,詳見SAE。
JokerPushnewsActivity
這個用戶註冊類和登陸比較類似,收集用戶信息上傳服務器,然後返回成功或者失敗信息
private void reginstet() {
url = Model.REGISTET;
value = "{\"name\":\"" + regist_username.getText().toString() + "\",\"password\":\"" + regist_password.getText().toString() + "\"}";
ThreadPoolUtils.execute(new HttpPostThread(handler, url, value));
}
JokerSendCommentActivity
這個類主要處理笑話詳情頁,用戶可以在下面評論該笑話,也以listview展示評論信息。頂部顯示一條笑話,下部顯示類似首頁笑話展示的評論展示,還有提交評論,代碼跟展示笑話差不多,不再贅述。
JokerStatisticsActivity
這個類是後臺統計類,統計應用的用戶數量,管理員數量,笑話數量等等信息,用於分析應用情況。用到com.joker.graphs裏的圖標展示類。該類只起到跳轉作用。
JokerUserImage
這個類主要用於用戶設置自己的頭像信息,頭像是應用規定好的幾種類型,供用戶挑選,用戶選擇後上傳給服務器頭像信息修改好頭像信息參數即可。
com.joker.adapter
這個包裏主要包含了各個listview,viewpager的適配器
FragmentViewPagerAdapter
該適配器類繼承了PagerAdapter類,主要做了初始化各個fragment的工作,還有點擊,滑動等監聽,主要代碼如下:
@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment fragment = fragments.get(position);
if (!fragment.isAdded()) { // 如果fragment還沒有added
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.add(fragment, fragment.getClass().getSimpleName());
ft.commit();
/**
* 在用FragmentTransaction.commit()方法提交FragmentTransaction對象後
* 會在進程的主線程中,用異步的方式來執行。 如果想要立即執行這個等待中的操作,就要調用這個方法(只能在主線程中調用)。
* 要注意的是,所有的回調和相關的行爲都會在這個調用中被執行完成,因此要仔細確認這個方法的調用位置。
*/
fragmentManager.executePendingTransactions();
}
if (fragment.getView().getParent() == null) {
container.addView(fragment.getView()); // 爲viewpager增加布局
}
return fragment.getView();
}
//頁面選擇回調
@Override
public void onPageSelected(int i) {
fragments.get(currentPageIndex).onPause(); // 調用切換前Fargment的onPause()
// fragments.get(currentPageIndex).onStop(); // 調用切換前Fargment的onStop()
if (fragments.get(i).isAdded()) {
// fragments.get(i).onStart(); // 調用切換後Fargment的onStart()
fragments.get(i).onResume(); // 調用切換後Fargment的onResume()
}
currentPageIndex = i;
if (null != onExtraPageChangeListener) { // 如果設置了額外功能接口
onExtraPageChangeListener.onExtraPageSelected(i);
}
mCurrentPageIndex = i;
}
//頁面滑動回調
@Override
public void onPageScrolled(int position, float positionOffset,int positionOffsetPx) {
if (null != onExtraPageChangeListener) { // 如果設置了額外功能接口
onExtraPageChangeListener.onExtraPageScrolled(position,positionOffset, positionOffsetPx);
}
}
MyApplyAdminAdapter
這個類主要用於設置用戶成管理員的listview的適配器,然後把修改信息上傳服務器即可。
MyCancleAdminAdapter
這個類主要用於設置管理員降級成普通用戶的listview的適配器,然後把修改信息上傳服務器即可。
MyCommentListAdapter
這個類是主要用於單純顯示評論信息的listview的適配器
MyListAdapter
該類是笑話顯示主頁的listview最重要的適配器,裏面重要的部分主要還包含顯示圖像,處理音頻,點贊,分享等一些操作。例如我們在做listview顯示每個item的圖像時顯示不正常,於是用開源的listview圖像顯示工具在做,如下:
//顯示圖片
if(list.get(arg0).getImage().equalsIgnoreCase("")){
hold.Img.setVisibility(View.GONE);
}else{
imageLoader.DisplayImage(Model.HTTPSTOR + list.get(arg0).getImage(), hold.Img);
hold.Img.setVisibility(View.VISIBLE);
}
//imageLoader類在工具類裏,詳見utils包
com.joker.graphs
裏面包含了三個數據圖表的展示類,包括餅圖,線型圖等
JokerStatisticsJokePost
該類是引用了外部工具顯示,不再詳述。
JokerStatisticsUserProportion
如上。
JokerStatisticsUserRegist
如上。
com.joker.info
這個包裏包含了評論、用戶、笑話信息類,方便這幾種消息的傳遞,均寫好get,set方法
CommentsInfo
評論信息類
private int commentsID;
private String comment;
private int jokeID;
private int userID;
private String username;
private int time;
JokeInfo
笑話信息類
private int jokeID;
private int usernameID;
private String username;
private String image;
private String radio;
private String text;
private int like;
private int share;
private int commentstimes;
private int time;
private int ischecked;
private String head;
UserInfo
用戶信息類
private int userID;
private String username;
private String password;
private int age;
private String hobbies;
private String place;
private int score;
private String time;
private String head;
private int sex;
private String email;
private int status;
private String audiorole;
private int audiospeed;
private int applyforadmin;
com.joker.model
封裝連接服務器的鏈接信息,也方便編程
Model
保存用到的傳輸網址,例:
// 主頁
public static String HTTPURL = "http://*****.com/";
// 數據倉庫主頁
public static String HTTPSTOR = "http://*****.com/";
// 註冊用戶頁面
public static String REGISTET = "*****.php";
com.joker.myview
包含定製的listview,用於評論的listview和笑話顯示的listview
JokerDetailsListView
這個類用於評論內容的listview,代碼過於簡單不再展示。
MyListView
也繼承於Listview,主要包括頭部下拉刷新,刷新狀態監管
//主要的初始化部分
private void init(Context context) {
setCacheColorHint(0x00000000);//去除ListView的拖動背景色
inflater = LayoutInflater.from(context);//獲取實例
headView = (LinearLayout) inflater.inflate(R.layout.lay_jokes_header, null);//獲取下拉刷新佈局
arrowImageView = (ImageView) headView.findViewById(R.id.head_arrowImageView);//獲取下拉刷新佈局的箭頭圖像
arrowImageView.setMinimumWidth(70);//設置最小寬度爲70
arrowImageView.setMinimumHeight(50);//設置最小高度爲50
progressBar = (ProgressBar) headView// 獲取下拉刷新佈局的圓形進度條
.findViewById(R.id.head_progressBar);
tipsTextview = (TextView) headView.findViewById(R.id.head_tipsTextView);//獲取下拉刷新提示語實例
measureView(headView);//測量視圖,只有執行完該方法才能獲得其視圖寬高
headContentHeight = headView.getMeasuredHeight();//獲取視圖高度
headView.setPadding(0, -1 * headContentHeight, 0, 0);//設置padding
headView.invalidate();//刷新view,使修改結果生效
addHeaderView(headView, this, false);//爲ListView添加頭部下拉刷新佈局
setOnScrollListener(this);//設置滑動監聽
animation = new RotateAnimation(0, -180,
RotateAnimation.RELATIVE_TO_SELF, 0.5f,
RotateAnimation.RELATIVE_TO_SELF, 0.5f);//設置箭頭翻轉動畫
animation.setInterpolator(new LinearInterpolator());//設置動畫以勻速的速率改變
animation.setDuration(250);//設置動畫持續時間
animation.setFillAfter(true);//當動畫執行完畢後,view對象保留在終止位置
reverseAnimation = new RotateAnimation(-180, 0,
RotateAnimation.RELATIVE_TO_SELF, 0.5f,
RotateAnimation.RELATIVE_TO_SELF, 0.5f);//設置箭頭轉回動畫
reverseAnimation.setInterpolator(new LinearInterpolator());//設置動畫以勻速的速率改變
reverseAnimation.setDuration(200);//設置動畫持續時間
reverseAnimation.setFillAfter(true);//當動畫執行完畢後,view對象保留在終止位置
state = DONE;
isRefreshable = false;
}
public boolean onTouchEvent(MotionEvent event) {
if (isRefreshable) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
if (firstItemIndex == 0 && !isRecored) {
isRecored = true;
startY = (int) event.getY();
}
break;
case MotionEvent.ACTION_UP:
if (state != REFRESHING && state != LOADING) {
if (state == DONE) {
}
if (state == PULL_To_REFRESH) {
state = DONE;
changeHeaderViewByState();
}
if (state == RELEASE_To_REFRESH) {
state = REFRESHING;
changeHeaderViewByState();
onRefresh();
}
}
isRecored = false;
isBack = false;
break;
case MotionEvent.ACTION_MOVE:
int tempY = (int) event.getY();
if (!isRecored && firstItemIndex == 0) {
isRecored = true;
startY = tempY;
}
if (state != REFRESHING && isRecored && state != LOADING) {
if (state == RELEASE_To_REFRESH) {
setSelection(0);
if (((tempY - startY) / RATIO < headContentHeight)
&& (tempY - startY) > 0) {
state = PULL_To_REFRESH;
changeHeaderViewByState();
} else if (tempY - startY <= 0) {
state = DONE;
changeHeaderViewByState();
}
}
if (state == PULL_To_REFRESH) {
setSelection(0);
if ((tempY - startY) / RATIO >= headContentHeight) {
state = RELEASE_To_REFRESH;
isBack = true;
changeHeaderViewByState();
}
else if (tempY - startY <= 0) {
state = DONE;
changeHeaderViewByState();
}
}
if (state == DONE) {
if (tempY - startY > 0) {
state = PULL_To_REFRESH;
changeHeaderViewByState();
}
}
if (state == PULL_To_REFRESH) {
headView.setPadding(0, -1 * headContentHeight
+ (tempY - startY) / RATIO, 0, 0);
}
if (state == RELEASE_To_REFRESH) {
headView.setPadding(0, (tempY - startY) / RATIO
- headContentHeight, 0, 0);
}
}
break;
}
}
return super.onTouchEvent(event);
}
private void changeHeaderViewByState() {
switch (state) {
case RELEASE_To_REFRESH:
arrowImageView.setVisibility(View.VISIBLE);
progressBar.setVisibility(View.GONE);
tipsTextview.setVisibility(View.VISIBLE);
// lastUpdatedTextView.setVisibility(View.VISIBLE);
arrowImageView.clearAnimation();
arrowImageView.startAnimation(animation);
tipsTextview.setText("釋放立即刷新...");
break;
case PULL_To_REFRESH:
progressBar.setVisibility(View.GONE);
tipsTextview.setVisibility(View.VISIBLE);
// lastUpdatedTextView.setVisibility(View.VISIBLE);
arrowImageView.clearAnimation();
arrowImageView.setVisibility(View.VISIBLE);
if (isBack) {
isBack = false;
arrowImageView.clearAnimation();
arrowImageView.startAnimation(reverseAnimation);
}
tipsTextview.setText("下拉刷新...");
break;
case REFRESHING:
headView.setPadding(0, 0, 0, 0);
progressBar.setVisibility(View.VISIBLE);
arrowImageView.clearAnimation();
arrowImageView.setVisibility(View.GONE);
tipsTextview.setText("拼命加載中...");
// lastUpdatedTextView.setVisibility(View.VISIBLE);
break;
case DONE:
headView.setPadding(0, -1 * headContentHeight, 0, 0);
progressBar.setVisibility(View.GONE);
arrowImageView.clearAnimation();
arrowImageView.setImageResource(R.drawable.arrow);
tipsTextview.setText("下拉刷新");
// lastUpdatedTextView.setVisibility(View.VISIBLE);
break;
}
}
com.joker.net
網絡包,包含網絡處理的各種類
IsNet
用於檢測是否有網絡連接
public boolean IsConnect() {
ConnectivityManager manager = (ConnectivityManager) ctx
.getSystemService(ctx.CONNECTIVITY_SERVICE);
NetworkInfo info = manager
.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
State stata = null;
if (info != null) {
stata = info.getState();
if (stata == State.CONNECTED)
return true;
}
info = null;
info = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
stata = null;
if (info != null) {
stata = info.getState();
if (stata == State.CONNECTED) {
return true;
}
}
return false;
}
MyGet
get請求的類
public String doGet(String url) throws ClientProtocolException, IOException {
String result = null;// 我們的網絡交互返回值
HttpGet myGet = new HttpGet(url);
HttpClient httpClient = new DefaultHttpClient();
httpClient.getParams().setIntParameter(
HttpConnectionParams.CONNECTION_TIMEOUT, 5 * 1000);
httpClient.getParams().setIntParameter(HttpConnectionParams.SO_TIMEOUT,
30 * 1000);
try {
HttpResponse httpResponse = httpClient.execute(myGet);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
result = EntityUtils
.toString(httpResponse.getEntity(), "utf-8");
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
MyPost
post請求方式類
// 上傳圖文音頻
public String doPost(String url, String img, String value, String radio) {
String result = null;
HttpResponse httpResponse = null;
HttpPost post = new HttpPost(Model.HTTPURL + url);
DefaultHttpClient client = new DefaultHttpClient();
client.getParams().setIntParameter(HttpConnectionParams.SO_TIMEOUT,
30000); // 超時設置
client.getParams().setIntParameter(
HttpConnectionParams.CONNECTION_TIMEOUT, 10000);// 連接超時
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("value", value));
nameValuePairs.add(new BasicNameValuePair("img", img));
nameValuePairs.add(new BasicNameValuePair("radio", radio));
try {
post.setEntity(new UrlEncodedFormEntity(nameValuePairs, "utf-8"));
httpResponse = client.execute(post);
Log.e("HTTP", "CODE" + httpResponse.getStatusLine().getStatusCode());
if (httpResponse.getStatusLine().getStatusCode() == 200) {
result = EntityUtils.toString(httpResponse.getEntity(), "utf-8");
Log.e("HTTP", "result:" + result);
} else {
result = null;
}
} catch (UnsupportedEncodingException e) {
result = null;
} catch (ClientProtocolException e) {
result = null;
} catch (IOException e) {
result = null;
}
return result;
}
ThreadPoolUtils
我們網絡請求線程池:限制並行的網絡請求線程。
public class ThreadPoolUtils {
private ThreadPoolUtils() {
}
// 定義核心線程數,並行線程數
private static int CORE_POOL_SIZE = 3;
// 線程池最大線程數:除了正在運行的線程額外保存多少個線程
private static int MAX_POOL_SIZE = 200;
// 額外線程空閒狀態生存時間
private static int KEEP_ALIVE_TIME = 5000;
// 阻塞隊列。當核心線程隊列滿了放入的
// 初始化一個大小爲10的泛型爲Runnable的隊列
private static BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<Runnable>(
10);
// 線程工廠,把傳遞進來的runnable對象生成一個Thread
private static ThreadFactory threadFactory = new ThreadFactory() {
// 原子型的integer變量生成的integer值不會重複
private final AtomicInteger ineger = new AtomicInteger();
@Override
public Thread newThread(Runnable arg0) {
return new Thread(arg0, "MyThreadPool thread:"
+ ineger.getAndIncrement());
}
};
// 當線程池發生異常的時候回調進入
private static RejectedExecutionHandler handler = new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
// 進行重啓操作
}
};
// 線程池ThreadPoolExecutor java自帶的線程池
private static ThreadPoolExecutor threadpool;
// 靜態代碼塊,在類被加載的時候進入
static {
threadpool = new ThreadPoolExecutor(CORE_POOL_SIZE, MAX_POOL_SIZE,
KEEP_ALIVE_TIME, TimeUnit.SECONDS, workQueue, threadFactory,
handler);
}
public static void execute(Runnable runnable) {
threadpool.execute(runnable);
}
}
com.joker.splash
應用的啓動畫面類,還存放新浪push服務的接收類
MsgReceiveService
新浪的push接收類,詳見新浪SAE裏的push服務
SplashActivity
應用啓動畫面類
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_splash);
isnet = new IsNet(this);
//檢測自動登錄設置
sharedPreferences = this.getSharedPreferences("userInfo",Context.MODE_WORLD_READABLE);
if (sharedPreferences.getBoolean("AUTO_ISCHECK", false)&&isnet.IsConnect()) {
login_username = sharedPreferences.getString("userName", "");
login_password = sharedPreferences.getString("passWord", "");
url = Model.LOGIN;
value = "{\"name\":\"" + login_username + "\",\"password\":\""
+ login_password + "\"}";
ThreadPoolUtils.execute(new HttpPostThread(handler_login, url, value));
}else{
handler.postDelayed(new Runnable()
{
@Override
public void run()
{
PushManager manager = PushManager.getInstance(getApplicationContext());
manager.openChannel("20946","100","100");
Intent intent = new Intent(SplashActivity.this, JokerMainActivity.class);
startActivity(intent);
finish();
}
}, 3000);
}
}
com.joker.thread
線程類,包含自定義的get,post線程類
HttpGetThread
get方式的http線程類,實現Runnable類
@Override
public void run() {
// 獲取我們回調主UI的message
Message msg = hand.obtainMessage();
try {
String result = myGet.doGet(url);
msg.what = 200;
msg.obj = result;
} catch (ClientProtocolException e) {
msg.what = 404;
} catch (IOException e) {
msg.what = 100;
}
// 給主UI發送消息傳遞數據
hand.sendMessage(msg);
}
HttpPostThread
post方式的http線程類,實現Runnable類
@Override
public void run() {
// 獲取我們回調主UI的message
Message msg = hand.obtainMessage();
String result = null;
if (img.equalsIgnoreCase("")&&radio.equalsIgnoreCase("")) {
result = myGet.doPost(url, value);
}else if(radio.equalsIgnoreCase("")&&!img.isEmpty()){
result = myGet.doPost(url, img, value, "");
}else if(img.equalsIgnoreCase("")&&!radio.isEmpty()){
result = myGet.doPost(url, "", value, radio);
}else{
result = myGet.doPost(url, img, value, radio);
}
msg.what = 200;
msg.obj = result;
// 給主UI發送消息傳遞數據
hand.sendMessage(msg);
}
com.joker.utils
工具包,項目用到的工具均在此
Base64Util
壓縮類,用於把圖像,音頻壓縮成字符串流
public static String encodeBase64File(String path) throws Exception {
File file = new File(path);
FileInputStream inputFile = new FileInputStream(file);
byte[] buffer = new byte[(int) file.length()];
inputFile.read(buffer);
inputFile.close();
return android.util.Base64.encodeToString(buffer, Base64.DEFAULT);
}
FileCache/MemoryCache/ImageLoader/Utils
文件緩存,內存緩存,圖像加載,用於首頁圖像加載,緩存圖像節省用戶的流量消耗,用的是github上的開源加載listview裏的圖片項目,不再詳述。
JokerShare
笑話分享類
MyJson
該類用於解析服務器返回的json數據,例:
// @author 鄭軒 參數value : 服務器返回的Json格式數據 解析JSON數據獲取笑話 返回List<JokeInfo>
public List<JokeInfo> getJokeList(String value) {
List<JokeInfo> jokelist = new ArrayList<JokeInfo>();
try {
JSONArray joke = new JSONArray(value);
for (int i = 0; i < joke.length(); i++) {
JokeInfo jokeinfo = new JokeInfo();
JSONObject joketemp = joke.getJSONObject(i);
jokeinfo.setJokeID(joketemp.getInt("VID"));
jokeinfo.setUsernameID(joketemp.getInt("UID"));
jokeinfo.setImage(joketemp.getString("IMG"));
jokeinfo.setRadio(joketemp.getString("RADIO"));
jokeinfo.setText(joketemp.getString("TEXT"));
jokeinfo.setLike(joketemp.getInt("LIKE"));
jokeinfo.setShare(joketemp.getInt("SHARE"));
jokeinfo.setCommentstimes(joketemp.getInt("COMMENTSTIMES"));
jokeinfo.setTime(joketemp.getInt("TIME"));
jokeinfo.setIschecked(joketemp.getInt("ISCHECKED"));
jokeinfo.setUsername(joketemp.getString("NAME"));
jokeinfo.setHead(joketemp.getString("HEAD"));
jokelist.add(jokeinfo);
}
} catch (JSONException e) {
e.printStackTrace();
}
return jokelist;
}