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;
}
本文是对一个Android笑话项目的总结,涵盖了主体包com.joker的各个组件,包括MainActivity的界面初始化,事务层如用户登录、注册、管理等功能,适配器类的实现,图表展示,信息类的数据封装,网络请求和线程管理,以及工具类的使用。
2156

被折叠的 条评论
为什么被折叠?



