极客匿名项目APP学习

极客网,极客匿名项目APP学习学习总结:

该项目非常简单学到内容及运用到技术:

1.全部根据文档要求,规范化开发项目,一步一步的实现功能效果。

2.MD5工具使用

3.URLConnection进行网络连接,并进行封装。

4.AsyncTask异步任务的使用

5.获取联系人,并进行JSON转化。

6.缓存的使用

7.adapter的使用

项目Client和Server及文档下载地址:http://download.csdn.net/detail/itjavawfc/8553795

一)缓存使用:

public static final String KEY_TOKEN="token";
	//缓存token
	public static String getCachedToken(Context context){
		return context.getSharedPreferences(APP_ID, Context.MODE_PRIVATE).getString(KEY_TOKEN, null);
	}

	public static void cacheToken(Context context,String token){
		Editor e=context.getSharedPreferences(APP_ID, Context.MODE_PRIVATE).edit();
		e.putString(KEY_TOKEN, token);
		e.commit();
	}

	//缓存电话号码
	public static String getCachedPhoneNum(Context context){
		return context.getSharedPreferences(APP_ID, Context.MODE_PRIVATE).getString(KEY_PHONE_NUM, null);
	}

	public static void cachePhoneNum(Context context,String phoneNum){
		Editor e=context.getSharedPreferences(APP_ID, Context.MODE_PRIVATE).edit();
		e.putString(KEY_TOKEN, phoneNum);
		e.commit();
	}

二)AsyncTask异步任务的使用和NetConnection封装的URLConnection

public class NetConnection {
	public NetConnection(final String url,final HttpMethod method,final SuccessCallback successCallback,final FailCallback failCallback,final String ... kvs){
		new AsyncTask<Void, Void, String>() {
			@Override
			protected String doInBackground(Void... params) {
				StringBuffer paramsStr=new StringBuffer();
				for(int i=0;i<kvs.length;i+=2){
					paramsStr.append(kvs[i]).append("=").append(kvs[i+1]).append("&");
				}
				paramsStr.substring(0, paramsStr.length()-2);
				try {
					URLConnection uc;
			        //两种不同的方式来上传数据
					switch(method){
					case POST:
						uc=new URL(url).openConnection();
						uc.setDoOutput(true);
						BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(uc.getOutputStream(),Config.CHARSET));
						bw.write(paramsStr.toString());
						bw.flush();
						break;
					default:
						uc=new URL(url+"?"+paramsStr.toString()).openConnection();
					    break;
					}

					System.out.println("Request url:"+uc.getURL());
					System.out.println("Request data:"+paramsStr);
					//读取数据
					BufferedReader br=new BufferedReader(new InputStreamReader(uc.getInputStream(), Config.CHARSET));
					String line=null;
					StringBuffer result=new StringBuffer();
					while((line=br.readLine())!=null){
						result.append(line);
					}

					System.out.println("Result:"+result.toString());
					return result.toString();

				} catch (MalformedURLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				return null;
			}
			@Override
			protected void onPostExecute(String result) {
				super.onPostExecute(result);
				if(result!=null){
					if(successCallback!=null){
						successCallback.onSuccess(result);
					}
				}else{
					if(failCallback!=null){
						failCallback.onFail();
					}
				}
			}
		}.execute();
	}

	public static interface SuccessCallback{
		void onSuccess(String result);
	}
	public static interface FailCallback{
		void onFail();
	}

}

利用封装类,借助它来从网络上获取数据:

public class UploadContacts {
	public UploadContacts(String phone_md5,String token,String contacts,final SuccessCallback successCallback,final FailCallback failCallback){
		new NetConnection(Config.SERVER_URL, HttpMethod.POST, new NetConnection.SuccessCallback() {
			@Override
			public void onSuccess(String result) {
				try {
					JSONObject obj=new JSONObject(result);
				    switch(obj.getInt(Config.KEY_STATUS)){
				    case Config.RESULT_STATUS_SUCCESS:
							if(successCallback!=null){
								successCallback.onSuccess();
							}
				    	break;
				    case Config.RESULT_STATUS_INVALID_TOKEN:
				    	if(failCallback!=null){
							failCallback.onFail(Config.RESULT_STATUS_INVALID_TOKEN);
						}
				    	break;
				    default:
				    	if(failCallback!=null){
							failCallback.onFail(Config.RESULT_STATUS_FAIL);
						}
				    	break;
				    }
				} catch (JSONException e) {
					e.printStackTrace();
					if(failCallback!=null){
						failCallback.onFail(Config.RESULT_STATUS_FAIL);
					}
				}

			}
		}, new NetConnection.FailCallback() {
			@Override
			public void onFail() {
				if(failCallback!=null){
					failCallback.onFail(Config.RESULT_STATUS_FAIL);
				}
			}
		}, Config.KEY_ACTION,Config.ACTION_UPLOAD_CONTACTS,Config.KEY_PHONE_MD5,phone_md5,Config.KEY_TOKEN,token,Config.KEY_CONTACTS,contacts);
	}

	public static interface SuccessCallback{
		void onSuccess();
	}

	public static interface FailCallback{
		void onFail(int errorCode);
	}

}

三)读取联系人【一般项目都有的一个小功能】:

public class MyContacts {
	public static String getContactsJSONString(Context context){
		Cursor c=context.getContentResolver().query(Phone.CONTENT_URI, null, null, null, null);
		String phoneNum;
		JSONArray jsonArr=new JSONArray();
		JSONObject jsonObj;

		while(c.moveToNext()){
			phoneNum=c.getString(c.getColumnIndex(Phone.NUMBER));

			if(phoneNum.charAt(0)=='+'&&phoneNum.charAt(1)=='8'&&
					phoneNum.charAt(2)=='6'){

			}
			jsonObj=new JSONObject();
			try {
				jsonObj.put(Config.KEY_PHONE_MD5, MD5Tool.md5(phoneNum));
			} catch (JSONException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			jsonArr.put(jsonObj);
		}
		System.out.println(jsonArr.toString());
		return jsonArr.toString();
	}
}

四)Adapter的创建:里面有添加和删除数据的方法,还有获得Context方法,非常有用。

public class AtyMessageCommentListAdapter extends BaseAdapter {
	private Context context;
	public Context getContext() {
		return context;
	}

	public AtyMessageCommentListAdapter(Context context) {

		this.context=context;
	}

	private List<Comment> comments=new ArrayList<Comment>();

	@Override
	public int getCount() {
		return comments.size();
	}

	@Override
	public Object getItem(int position) {

		return comments.get(position);
	}

	@Override
	public long getItemId(int position) {
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {

		if(convertView==null){
			convertView=LayoutInflater.from(getContext()).inflate(R.layout.aty_comments_list_cell, null);
			convertView.setTag(new ListCell((TextView)convertView.findViewById(R.id.tvCellLabel)));
		}
		ListCell lc=(ListCell) convertView.getTag();

		Comment comment=(Comment) getItem(position);

		lc.getTvCellLabel().setText(comment.getContent());

		return convertView;
	}

	public void addAll(List<Comment> data){
		comments.addAll(data);
		notifyDataSetChanged();
	}

	public void clear(){
		comments.clear();
		notifyDataSetChanged();
	}

	private static class ListCell{
		private TextView tvCellLabel;

		public ListCell(TextView tvCellLabel){
			this.tvCellLabel=tvCellLabel;

		}
		public TextView getTvCellLabel() {
			return tvCellLabel;
		}
	}

}
时间: 2024-11-20 06:08:54

极客匿名项目APP学习的相关文章

极客48小时APP设计大赛

为期三天的极客APP设计大赛,完美结束.下面我们来介绍这个大赛的整个过程. 一 极客APP设计大赛性质 由铂涛孵化器主办,百思一刻承办的铂涛创新体验极客挑战赛.主要由在校大学生.社会工作人士.创业者等组成的.期间有国家发改委主任等领导人莅临现场. 二 参赛的规模 整个过程总共有300个团队及个人报名参加报名,最终由举办方精选了16个团队80人参赛.里面有酷狗音乐第一队,小跑科技的第16对等等. 我们是代表公司参赛的,公司总共有两个队:第12队和第8队. 三 比赛时间 48小时激烈角逐和一下午的路

极客设计模式之美学习-传统MVC和DDD充血模型(二)

贫血模型 贫血模型例子 现在传统的MVC开发基本上都是贫血模型 如以下代码 我们工作中经常使用 ////////// Controller+VO(View Object) ////////// public class UserController { private UserService userService; //通过构造函数或者IOC框架注入 public UserVo getUserById(Long userId) { UserBo userBo = userService.get

极客学院Android视频分享

知识是用来分享的,愿能够帮助需要帮助的人,相互学习相互交流共同进步! 这是极客学院关于Android学习的一部分视频,还是非常有学习的意义的. 其中涉及到Android基本知识点,项目知识,新技术相关学习. 分享地址:http://pan.baidu.com/s/1gd7vEcr    密码:q3hf

极客编程小挑战#28:实现二级菜单的炫酷显示效果

那么本期挑战的内容是什么?容我卖个关子- 极客标签是一个学习前端知识和分享前端知识的平台.以往的挑战形式,更加偏向于学生完成老师布置的作业.而本期挑战,希望参赛者换个身份参与进来,将自己学习的知识讲授给他人.通过课程的形式,完成任务,并讲解详细,以帮助前端初学者更好地学习为目的,完成此次挑战.   本期挑战: 实现 单击按钮“分享更多”后,下级菜单呈现炫酷显示效果,下级菜单内容如下图(极客标签每篇文章后的分享方式),效果越炫越好- 本次挑战的作品在课程库中添加,以讲解详细.课程效果好为目的.课程

别小看树莓派 极客们玩出16个倍儿有趣的项目

别小看树莓派 极客们玩出16个倍儿有趣的项目 [摘要]极客和DIY爱好者使用树莓派进行无数小发明,其中一些项目非常有趣,比如机器人管家.高空拍照气球.傻瓜相机.复古游戏机等等. 腾讯数码讯(编译:Raul)新一代的树莓派体积更小.价格更低,可以利用的领域更多,因此它也成为了树莓派历史上最受欢迎的一代产品.而对于广大极客和DIY爱好者来说,如何好好的将树莓派利用一番,似乎也成为了非常有趣的项目.下面就让我们一起来看看在星球上都有哪些使用到树莓派的小发明让我们足够感兴趣. 1.定格相机 其实树莓派在

极客标签:可能是目前最好的前端代码学习工具

英国著名作家萧伯纳有一句名言:"两个人交换了苹果,每个人手里还是只有一个苹果:但是两个人交换了思想,每个人就同时有了两个人的思想."这说的是知识的分享对于人类进步的重要意义.时间到了现代,技术进步带给人们更多样化的沟通方式.可是,当人们交换各种类型的知识的时候,却发现依然没那么容易. 绝大多数有学问的人都选择了出书:网络的普及也让各种各样的博客出现,之后则是微信公众号的天下:也有人选择了言传身教的现代版--录制讲学视频. 但以上的各种方式都不适合编程学习,特别是web设计方面的学习.你

极客标签:用代码回放来愉快地学习前端知识

网 页编程学习的过程中最痛苦的是什么?你看到各种大牛写下的代码和旁边只言片语的说明,但你根本无法理解整套代码是怎样写下来的,大牛写的时候遵循的是什么 样的逻辑.教程放在一个屏幕,然后你自己的编程工具放在另一个屏幕,你在两个屏幕之间切换过来切换过去,浪费了时间浪费了力气. 结果呢?你把大牛的代码复制过来,把自己的项目内容放进去,做出了一个和大牛写的一样的网页,却感觉到自己根本什么都没学到.网页编程,以及所有编程学习中最痛苦的地方在于你试图理解你的学习对象的思路,但常规的教学材料的传播方式生硬,对于

# &quot;做中学&quot;之“极客时间”课程学习指导

目录 "做中学"之"极客时间"课程学习指导 所有课程都可以选的课程 Java程序设计 移动平台开发 网络攻防实践 信息安全系统设计基础 信息安全专业导论 极客时间课程介绍 Winter.程劭非.重学前端 宝玉.软件工程之美 蔡能.从0开始学游戏开发 陈旸.数据分析实战45讲 丁雪丰.玩转Spring全家桶 范学雷.代码精进之路 高磊.9小时搞定微信小程序开发 郝林.Go语言核心36讲 洪亮劼.AI技术内参 胡峰.程序员进阶攻略 胡忠想.从0开始学微服务 黄申.程序员

asm 极客时间学习

导入极客时间的asm demo学习,编译的时候遇到一些问题, 1, 导入的依赖太旧 2, groovy里面有语法错误(声明为final 又去赋值) 3, ASMCode文件里有些语法与现有语法不匹配错误(getType) 这里有些东西是使用groovy写的,主要也是对接给gradle看的,因为gradle认groovy和kotlin但是不认java, 这也可能是为什么didi的booster使用kotlin写. 4, 还有一点,这个作者也在issue里面说了,使用方法是: 执行编译asm对应的插