//第一个URL,等着为后面服务
public static final String login_url = "http://jwxt.jit.edu.cn";
//第一个Post模拟登陆的URL
public static final String login_url2 = "http://jwxt.jit.edu.cn/default2.aspx";
HttpPost httpPost = new HttpPost(login_url2); //建立一个Post请求,第一步的方法是Post方法嘛
//禁止重定向,由于刚刚Post的状态值是重定向,所以我们要去禁止它,不然网页会乱飞。
httpPost.getParams().setParameter(ClientPNames.HANDLE_REDIRECTS, false);
//设置头部信息(头部信息在刚刚的Httpwatch下面Headers标签会有,不过我感觉写多跟写少没多大区别,只是多写没有坏处吧。)
httpPost.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko");
httpPost.setHeader("Content-Type","application/x-www-form-urlencoded");
//第一种模拟登陆传值
List params = new ArrayList();
//将刚刚获取到的值添加到List的中
params.add(new BasicNameValuePair("__VIEWSTATE","dDwtMTIwMTU3OTE3Nzs7PsvpgBGP9UryEzGkfCRBEu734TJ/"));
//params.add(new BasicNameValuePair("__VIEWSTATE", "/wEPDwUJNDcyMzA1MjkxZGRTx3lVi2lf6h+y/PVVH1qMZzouJg=="));
//params.add(new BasicNameValuePair("__EVENTVALIDATION", "/wEWCwLkl9v4DwLs0bLrBgLs0fbZDAK/wuqQDgKAqenNDQLN7c0VAuaMg+INAveMotMNAoznisYGArursYYIAt+RzN8IIdJ+D2D5xaddz6rv7AABSyHhO14="));
params.add(new BasicNameValuePair("TextBox1", "1205107009"));// 账号
params.add(new BasicNameValuePair("TextBox2", "*********"));// 密码(密码先保密吧。需要的话私聊)
params.add(new BasicNameValuePair("RadioButtonList1", "%D1%A7%C9%FA"));// 学生
params.add(new BasicNameValuePair("Button1", ""));
params.add(new BasicNameValuePair("lbLanguage", ""));
这样的话就把要模拟登陆的所有Post参数全部放到这个List当中了。大家看看在params.add值的时候有没有注意到我把其中的两行给注释掉了?还记得刚刚我记的绿色的标记不?这里我给大家解释一下,由于我们学校教务返回参数的时候会两种不同的情况,就是有时候是只但会一个__VIEWSTATE 的值,有时候返回__VIEWSTATE 和__EVENTVALIDATION 这两个值,而且两个__VIEWSTATE还不一样,这是我用HttpWatch观察到的,不知道你们学校的教务会不会出现这中情况,你们自己注意一下。这里我就直接使用第一种只传递__VIEWSTATE 的值 给大家做例子,另外一种情况我都注释在第一种情况的下行代码。ps:有的学校没有这种情况,而且居然不要验证码直接就能进入教务主页,比如像南邮。好,贴完刚刚将值加入List的代码,现在我们开始进行模拟登陆了。
try {
// 传递参数的时候注意编码使用,否则乱码
httpPost.setEntity(new UrlEncodedFormEntity(params, "GBK"));
//响应请求
HttpResponse response = client.execute(httpPost);
//获取响应状态码
int Status = response.getStatusLine().getStatusCode();
//302表示重定向状态
if(Status == 302||Status == 301){
//获取响应的cookie值
cookie = response.getFirstHeader("Set-Cookie").getValue();
//获取头部信息中Location的值
location = response.getFirstHeader("Location").getValue();
}
}
这一步是设置下Post值的编码方式,然后进行响应请求获取返回的信息。响应的状态码为302,刚刚已经在HttpWatch中看到了。那个这个时候重定向到哪里了呢,这个时候我们发现在Post下面的Get方式,通过Get方式访问的URL是http://jwxt.jit.edu.cn/xs_main.aspx?xh=1205107009 ,是一个带着查询字符串的URL,那么这个URL怎么获取呢。
这里我来解释一下,重定向后的信息都储存在头部信息中。如下图:
不然看出location的值就是主页地址的结尾部分。
这个时候的mianUrl = login_url + location即为http://jwxt.jit.edu.cn/xs_main.aspx?xh=1205107009 ,然后下一步是Get请求,状态码是200。这样就好做多了,不是吗?
HttpGet get = new HttpGet(mianUrl);
//关键点,这里有个关键点就是设置头部信息中的Referer和cookie值,cookie值大家都知道,模拟登陆的时候必须带着cookie一起访问,但是Referer我无法理解,但必须要设置。
//也就是必须指定它的Referer必须为当前访问的URL
get.setHeader("Referer", mianUrl);
get.addHeader("Cookie", cookie);
try {
//获取Get响应,如果状态码是200的话表示连接成功
HttpResponse httpResponse = new DefaultHttpClient().execute(get);
if(httpResponse.getStatusLine().getStatusCode() == 200){
HttpEntity entity = httpResponse.getEntity();
//获取纯净的主页HTML源码,这里大家可以将mianhtml定义在其他地方
String mainhtml = EntityUtils.toString(entity);
}
到这里呢,基本上就等于完事了,获取到主页的HTML纯文本之后就是通过Jsoup 包进行解析了,不会使用的话可以去查下它的API文档。
第二步:
下面我们就开始查询我们的成绩的了,首先呢还是HttpWatch工具,依次点击信息查询 中的成绩查询 ,然后点击按学期查询 就会查询到在校所有成绩了。
这里我们依然会发现因为是按了按钮,所以传递了值,所以还是Post请求,不是状态码是 200。
Post的URL是http://jwxt.jit.edu.cn/xscj_gc.aspx?xh=1205107009&xm=陈凯&gnmkdm=N121605
这里呢依然头疼的问题是URL的获取,我思索观察了半天,发现URL竟然在刚刚获取的mainhtml 文本中,是作为按钮跳转的地址。所以这个时候我们就需要用Jsoup来解析这个网页源码了。看代码:
//分析html
Document doc = Jsoup.parse(mainhtml);
//获取所有链接
Elements links = doc.select("a[href]");
//创建一个缓冲区
StringBuffer sff = new StringBuffer();
for(Element link : links){
//获取所要查询的URL,这里对应地址按钮的名字叫成绩查询
if(link.text().equals("成绩查询"))
//获取所要查询的相对地址,获取相对的地址
sff.append(link.attr("href"));
}
String str = sff.toString();
//返回查询的URL,将主页地址与相对地址连接起来,同样这里的cjcxUrl可以定义在外面
String cjcxUrl = login_url+ "/" + str ;
好了,这样成绩查询的URL就这么出来了。下面是Post请求。在下面标签Stream中查看到传递的参数是Button1 =" %B0%B4%D1%A7%C6%DA%B2%E9%D1%AF ",表示点下了按学期查询 ,ddlXN和ddlXQ都是空,如果你们学校教务有默认了值,你就按照你们教务的填上就好了。下面是__VIEWSTATE的值,虽然上面出现的是第二种值的情况,但是我这里还是以第一种为例子,我估计你们的学校也许不会出现这种情况。
public static List paramsgra1 = new ArrayList();
//可以发现这是第一种情况值的传递,虽然两种情况不一样,但是放心只要是你们学校的学生,登陆的时候值的情况都是两种,且值都是相同的。
paramsgra1.add(new BasicNameValuePair("__VIEWSTATE","dDwxNjgwNjIxMzEzO3Q8cDxsPHhoOz47bDwxMjA1MTA3MDA5Oz4+O2w8aTwxPjs+O2w8dDw7bDxpPDE+O2k8Mz47aTw1PjtpPDc+O2k8OT47aTwxMT47aTwxMz47aTwxNj47aTwyNj47aTwyNz47aTwyOD47aTwzND47aTwzNj47aTwzOD47aTwzOT47aTw0MT47aTw0Mj47aTw0ND47aTw0Nj47aTw0OD47aTw2MD47aTw2NT47PjtsPHQ8cDxwPGw8VGV4dDs+O2w85a2m5Y+377yaMTIwNTEwNzAwOTs+Pjs+Ozs+O3Q8cDxwPGw8VGV4dDs+O2w85aeT5ZCN77ya6ZmI5YevOz4+Oz47Oz47dDxwPHA8bDxUZXh0Oz47bDzlrabpmaLvvJrkv6Hmga/mioDmnK/lrabpmaI7Pj47Pjs7Pjt0PHA8cDxsPFRleHQ7PjtsPOS4k+S4mu+8mjs+Pjs+Ozs+O3Q8cDxwPGw8VGV4dDs+O2w86L2v5Lu25bel56iLKOacrCk7Pj47Pjs7Pjt0PHA8cDxsPFRleHQ7PjtsPOihjOaUv+ePre+8mjEy6L2v5Lu25bel56iL77yIMe+8iTs+Pjs+Ozs+O3Q8cDxwPGw8VGV4dDs+O2w8MjAxMjA1MDc7Pj47Pjs7Pjt0PHQ8O3Q8aTwxNT47QDxcZTsyMDAxLTIwMDI7MjAwMi0yMDAzOzIwMDMtMjAwNDsyMDA0LTIwMDU7MjAwNS0yMDA2OzIwMDYtMjAwNzsyMDA3LTIwMDg7MjAwOC0yMDA5OzIwMDktMjAxMDsyMDEwLTIwMTE7MjAxMS0yMDEyOzIwMTItMjAxMzsyMDEzLTIwMTQ7MjAxNC0yMDE1Oz47QDxcZTsyMDAxLTIwMDI7MjAwMi0yMDAzOzIwMDMtMjAwNDsyMDA0LTIwMDU7MjAwNS0yMDA2OzIwMDYtMjAwNzsyMDA3LTIwMDg7MjAwOC0yMDA5OzIwMDktMjAxMDsyMDEwLTIwMTE7MjAxMS0yMDEyOzIwMTItMjAxMzsyMDEzLTIwMTQ7MjAxNC0yMDE1Oz4+Oz47Oz47dDxwPDtwPGw8b25jbGljazs+O2w8d2luZG93LnByaW50KClcOzs+Pj47Oz47dDxwPDtwPGw8b25jbGljazs+O2w8d2luZG93LmNsb3NlKClcOzs+Pj47Oz47dDxwPHA8bDxWaXNpYmxlOz47bDxvPHQ+Oz4+Oz47Oz47dDxAMDw7Ozs7Ozs7Ozs7Pjs7Pjt0PEAwPDs7Ozs7Ozs7Ozs+Ozs+O3Q8QDA8Ozs7Ozs7Ozs7Oz47Oz47dDxAMDw7Ozs7Ozs7Ozs7Pjs7Pjt0PEAwPDs7Ozs7Ozs7Ozs+Ozs+O3Q8QDA8Ozs7Ozs7Ozs7Oz47Oz47dDxAMDw7Ozs7Ozs7Ozs7Pjs7Pjt0PEAwPHA8cDxsPFZpc2libGU7PjtsPG88Zj47Pj47Pjs7Ozs7Ozs7Ozs+Ozs+O3Q8QDA8cDxwPGw8VmlzaWJsZTs+O2w8bzxmPjs+Pjs+Ozs7Ozs7Ozs7Oz47Oz47dDxwPHA8bDxUZXh0Oz47bDxZUFhZOz4+Oz47Oz47dDxAMDw7Ozs7Ozs7Ozs7Pjs7Pjs+Pjs+Pjs+BX9xNmfFtmx2lSdmzHhoR2MpxKw="));
//paramsgra1.add(new BasicNameValuePair("__VIEWSTATE", "/wEPDwULLTE0NDU1MDczNjEPFgIeAnhoBQoxMjA1MTA3MDA5FgICAQ9kFiwCAQ8PFgIeBFRleHQFE+WtpuWPt++8mjEyMDUxMDcwMDlkZAIDDw8WAh8BBQ/lp5PlkI3vvJrpmYjlh69kZAIFDw8WAh8BBRvlrabpmaLvvJrkv6Hmga/mioDmnK/lrabpmaJkZAIHDw8WAh8BBQnkuJPkuJrvvJpkZAIJDw8WAh8BBRHova/ku7blt6XnqIso5pysKWRkAgsPDxYCHwEFIeihjOaUv+ePre+8mjEy6L2v5Lu25bel56iL77yIMe+8iWRkAg0PDxYCHwEFCDIwMTIwNTA3ZGQCEA8QZBAVDwAJMjAwMS0yMDAyCTIwMDItMjAwMwkyMDAzLTIwMDQJMjAwNC0yMDA1CTIwMDUtMjAwNgkyMDA2LTIwMDcJMjAwNy0yMDA4CTIwMDgtMjAwOQkyMDA5LTIwMTAJMjAxMC0yMDExCTIwMTEtMjAxMgkyMDEyLTIwMTMJMjAxMy0yMDE0CTIwMTQtMjAxNRUPAAkyMDAxLTIwMDIJMjAwMi0yMDAzCTIwMDMtMjAwNAkyMDA0LTIwMDUJMjAwNS0yMDA2CTIwMDYtMjAwNwkyMDA3LTIwMDgJMjAwOC0yMDA5CTIwMDktMjAxMAkyMDEwLTIwMTEJMjAxMS0yMDEyCTIwMTItMjAxMwkyMDEzLTIwMTQJMjAxNC0yMDE1FCsDD2dnZ2dnZ2dnZ2dnZ2dnZ2RkAhoPD2QWAh4Hb25jbGljawUPd2luZG93LnByaW50KCk7ZAIbDw9kFgIfAgUPd2luZG93LmNsb3NlKCk7ZAIcDw8WAh4HVmlzaWJsZWdkZAIiDzwrAAsAZAIkDzwrAAsAZAImDzwrAAsAZAInDzwrAAsAZAIpDzwrAAsAZAIqDzwrAAsAZAIsDzwrAAsAZAIuDzwrAAsBAA8WAh8DaGRkAjAPPCsACwEADxYCHwNoZGQCPA8PFgIfAQUEWVBYWWRkAkEPPCsACwBkZDO/nriqRqGoEf9J81ywNopcRE6l"));
//paramsgra1.add(new BasicNameValuePair("__EVENTVALIDATION", "/wEWGwKpihYC7sDphAUC/Onx6gUC/+nt/AsC9umZ6QQC+em18woC+Omh6QcC++nd8wUC8unJ6QYC9emlkAYC+unNqwgCoKvKxQ4Co6uOhAgCoquSxAkCvavWhAsCvKu6xAgC38DphAUC0K/D6gkC0a/D6gkC0q/D6gkCjOeKxgYCoMKT8Q0Cu6uxhggCz4a6sQ8Chdn12wMC1pTPmwIC6u/XxglYyInHMSCwi1+Sj12nmKQ31hu7wg=="));
paramsgra1.add(new BasicNameValuePair("Button1","%B0%B4%D1%A7%C6%DA%B2%E9%D1%AF"));
paramsgra1.add(new BasicNameValuePair("ddlXQ",""));
paramsgra1.add(new BasicNameValuePair("ddlXN",""));
以上就是你要进行成绩查询所要Post的值,下面呢进行Post请求
HttpPost cjpost = new HttpPost(login_cjcx);
//这一步是关键,跟刚刚一样,这里需要将cookie和Referer的设置一下,其他的话,不设置应该也没什么事,他们都是在HttpWatch的Post头信息中,你们自己去看看吧
cjpost.setHeader("Referer", login_cjcx);
cjpost.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko");
cjpost.setHeader("Content-Type","application/x-www-form-urlencoded");
cjpost.setHeader("Accept", "text/html, application/xhtml+xml, */*");
cjpost.setHeader("Connection", "Keep-Alive");
cjpost.addHeader("Cookie",connJK.loginCookie());
try{
//Post请求获取成绩的Html。将刚刚的成绩查询的List拿过来,设置编码。
cjpost.setEntity(new UrlEncodedFormEntity(paramsgra1, "gb2312"));
HttpResponse response = new DefaultHttpClient().execute(cjpost);
HttpEntity entity = response.getEntity();
//获取成绩的HTML源码
cjHtml = EntityUtils.toString(entity);
//自己打印出来看看
//System.out.println(cjHtml);
//关闭连接
cjpost.abort();
}
经过上面一系列的讲解,我们就可以获取成绩的HTML源码了,里面都是我们所需要的成绩。
同理,下面我们进行解析。
//处理获取的分数页面
Document cjdoc = Jsoup.parse(cjHtml);
// 获取到每行数据的选择器,这里的选择器你们可以观察下HTML代码,这里就不多说了。
String rowRegex = "div.main_box div.mid_box span.formbox table#Datagrid1.datelist tbody tr";
// 每行的数据元素
Elements rowElements = cjdoc.select(rowRegex);
List> list = new ArrayList>();
for (int i = 0; i < rowElements.size(); i++) {
Elements elements = rowElements.get(i).select("td");
//将每个的内容存放到map中
Map map = new HashMap();
//学年信息
map.put("k_xuenian", elements.get(0).text());
//学期信息
map.put("k_xueqi", elements.get(1).text());
//课程名字
map.put("k_kcname", elements.get(3).text());
//学分
map.put("k_xuefen", elements.get(6).text());
//几点
map.put("k_jidian", elements.get(7).text());
//成绩
map.put("k_chengji", elements.get(8).text());
list.add(map);
}
//创建一个简单适配器,这里也不多说了。
SimpleAdapter adapter = new SimpleAdapter(this,
list,
R.layout.k_kccx,
new String[] { "k_xuenian","k_xueqi","k_kcname","k_xuefen","k_jidian","k_chengji"},
new int[] { R.id.k_xuenian, R.id.k_xueqi,R.id.k_kcname,R.id.k_xuefen,R.id.k_jidian,R.id.k_chengji});
//通过一个ListView将这个适配器显示出来,然后就出现那种黑屏效果
ListView listview = new ListView(this);
listview.setAdapter(adapter);
PS:
以上显示之后,你会发现像第一张图那样的丑陋,所有该怎么处理数据,大家根据自己的能力和爱好自行处理。
至于其他的课表,考试时间呀什么的,大家自己去摸索摸索。。课表的话自己要经过一大堆的算法才能做出课程格子或者超级课表那种效果。
本人团队的话也只实现他们的初级版本。。。
最后大家去手动敲代码吧、敲敲更健康。。。
最后大家有什么不理解可以留言给我,大家可以互相交流交流。。。
你可能感兴趣的:(android)
android系统selinux中添加新属性property
辉色投像
1.定位/android/system/sepolicy/private/property_contexts声明属性开头:persist.charge声明属性类型:u:object_r:system_prop:s0图12.定位到android/system/sepolicy/public/domain.te删除neverallow{domain-init}default_prop:property
2.2.6 通知类控件 Toast、Menu
常思行
本文例程下载:WillFlow_Toast、WillFlowMenu一、什么是Toast?Toast也被叫做吐司,是Android系统提供的一种非常好的提醒方式,在程序中可以使用它将一些短小的信息通知给用户,它有如下两个特点:Toast是没有焦点的Toast显示的时间有限过一定的时间就会自动消失所以一般来讲Toast的使用并不会影响我们的正常操作,并且它通常不会占用太大的屏幕空间,有着良好的用户体
mac 备份android 手机通讯录导入iphone,iphone如何导出通讯录(轻松教你iPhone备份通讯录的方法)...
weixin_39762838
mac 备份android 手机通讯录导入iphone
在日新月异的手机更替中,换手机已经成为一个非常稀松平常的事情,但将旧手机上面的通讯录导入到新手机还是让不少小伙伴为难,本篇将给大家详细讲解这方面的知识:“苹果手机通讯录怎么导入到新手机”及“安卓手机通讯录导入到新手机”的方法。一、苹果手机通讯录导入到新手机常用方法(SIM卡导入)在苹果手机主频幕上找到“设置”,单击进入设置菜单,下拉菜单列表,点击“邮件、通讯录、日历”,然后找到“导入SIM卡通讯录
android 更改窗口的层次,浮窗开发之窗口层级
Ms.Bu
android 更改窗口的层次
最近在项目中遇到了这样的需求:需要在特定的其他应用之上悬浮自己的UI交互(拖动、输入等复杂的UI交互),和九游的浮窗类似,不过我们的比九游的体验更好,我们越过了很多授权的限制。浮窗效果很多人都知道如何去实现一个简单的浮窗,但是却很少有人去深入的研究背后的流程机制,由于项目中浮窗交互比较复杂,遇到了些坑查看了很多资料,故总结浮窗涉及到的知识点:窗口层级关系(浮窗是如何“浮”的)?浮窗有哪些限制,如何
Android应用性能优化
轻口味
Android
Android手机由于其本身的后台机制和硬件特点,性能上一直被诟病,所以软件开发者对软件本身的性能优化就显得尤为重要;本文将对Android开发过程中性能优化的各个方面做一个回顾与总结。Cache优化ListView缓存:ListView中有一个回收器,Item滑出界面的时候View会回收到这里,需要显示新的Item的时候,就尽量重用回收器里面的View;每次在getView函数中inflate新
Android实现监听事件的方法
Amy木婉清
1.通过内部类实现2.通过匿名内部类实现3.通过事件源所在类实现4.通过外部类实现5.布局文件中onclick属性(针对点击事件)1.通过内部类实现代码:privateButtonmBtnEvent;//oncreate中mBtnEvent.setOnClickListener(newOnClick());//内部类实现监听classOnClickimplementsView.OnClickLis
高级UI<第二十四篇>:Android中用到的矩阵常识
NoBugException
(1)定义在数学中,矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合。由m×n个数aij排成的m行n列的数表称为m行n列的矩阵,简称m×n矩阵。记作:图片.png这m×n个数称为矩阵A的元素,简称为元,数aij位于矩阵A的第i行第j列,称为矩阵A的(i,j)元,以数aij为(i,j)元的矩阵可记为(aij)或(aij)m×n,m×n矩阵A也记作Amn。元素是实数的矩阵称为实矩阵,元素是复
RK3229_Android9.0_Box 4G模块EC200A调试
suifen_
网络
0、kernel修改这部分完全可以参考Linux的移植:RK3588EC200A-CN【4G模块】调试_rkec200a-cn-CSDN博客1、修改device/rockchip/rk322xdiff--gita/device.mkb/device.mkindexec6bfaa..e7c32d1100755---a/device.mk+++b/device.mk@@-105,6+105,8@@en
kt文件和java文件_Java与Kotlin之间怎样进行互操作
铭空间
kt文件和java文件
Java与Kotlin之间怎样进行互操作发布时间:2021-02-0210:50:43来源:亿速云阅读:98作者:小新这篇文章主要介绍了Java与Kotlin之间怎样进行互操作,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言目前kotlin是谷歌首推的开发Android的语言,但由于历史原因,我们绝大部分项目依旧还是以Java为主
Android shell 常用 debug 命令
晨春计
Audio debug android linux
目录1、查看版本2、am命令3、pm命令4、dumpsys命令5、sed命令6、log定位查看APK进程号7、log定位使用场景1、查看版本1.1、Android串口终端执行getpropro.build.version.release#获取Android版本uname-a#查看linux内核版本信息uname-r#单独查看内核版本1.2、linux服务器执行lsb_release-a#查看Lin
2024年最全Flutter如何和Native通信-Android视角,Electron开发Android界面
2401_84544531
程序员 android 面试 学习
总结【Android详细知识点思维脑图(技能树)】其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。虽然Android没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明Android中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪
分享一个基于python的电子书数据采集与可视化分析 hadoop电子书数据分析与推荐系统 spark大数据毕设项目(源码、调试、LW、开题、PPT)
计算机源码社
Python项目 大数据 大数据 python hadoop 计算机毕业设计选题 计算机毕业设计源码 数据分析 spark毕设
作者:计算机源码社个人简介:本人八年开发经验,擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等,大家有这一块的问题可以一起交流!学习资料、程序开发、技术解答、文档报告如需要源码,可以扫取文章下方二维码联系咨询Java项目微信小程序项目Android项目Python项目PHP项目ASP.NET项目Node.js项目选题推荐项目实战|p
android ndk 开发jni调用对象方法,数组参数
wulongkou
开发问题 安卓的事 ndk android studio jni
一、JNI和NDK关系JNI是Java语言提供的Java和C/C++相互沟通的机制,Java可以通过JNI调用本地的C/C++代码,本地的C/C++的代码也可以调用java代码。JNI是本地编程接口,Java和C/C++互相通过的接口。Java通过C/C++使用本地的代码的一个关键性原因在于C/C++代码的高效性。NDK是一系列工具的集合。它提供了一系列的工具,帮助开发者快速开发C(或C++)的动
Android jni中数组参数的传递方式
lokeyme
Andriod android开发 JNI NDK java c语言
1、背景今天调试了一下Androidjni关于Java中调用C代码的程序,发现我的数组参数传递方式不对,导致值传递不正确,我的方法是:C代码,入口函数#include#includejintJava_sony_MedicalRecordDemo_MainActivity_decryptionSuccess(JNIEnv*env,jobjectthiz,jintAttr[]){returnAttr[
1-1.Jetpack 之 Navigation 简单编码模板
我命由我12345
Android - Jetpack 简化编程 java java-ee android-studio android studio 安卓 android jetpack
一、Navigation1、Navigation概述Navigation是Jetpack中的一个重要成员,它主要是结合导航图(NavigationGraph)来控制和简化Fragment之间的导航,即往哪里走,该怎么走2、Navigate引入在模块级build.gradle中引入相关依赖implementation'androidx.navigation:navigation-fragment:2
Android JetPack架构——结合记事本Demo一篇打通对Sqlite的增删改查结合常用jetpack架构应用
erhtre
程序员 android jetpack 架构 sqlite
为什么要用Jetpack?========================================================================关于为什么要用Jetpack,我参考了许多的博客和官方文档,开阔了我对Android生态圈的理解和认识,在Jetpack推出前出现的许许多多强大的第三方框架与语言,典型代表无疑是强大的RxJava在Jetpack仍然有许多粉丝在一
Android干净架构MVI模板使用指南
井美婵Toby
Android干净架构MVI模板使用指南android-clean-architecture-mvi-boilerplateAforkofourcleanarchitectureboilerplateusingtheModel-View-Intentpattern项目地址:https://gitcode.com/gh_mirrors/an/android-clean-architecture-mv
⭐Unity 安卓环境中正确地读取和处理 XML 文件
惊鸿醉
Unity unity android xml
写了一个选择题Demo,电脑包和编辑器内无问题,但是打包安卓手机之后题目无法正常使用,想到的是安卓环境中正确地读取文件的问题改进方案:1.由于XmlDocument.Load方法在Android上的路径问题(由于文件位于APK内部,无法像在文件系统中那样直接访问),需要先使用UnityWebRequest来异步加载文件内容,然后再解析XML。2.异步处理:修改你的代码,以支持异步文件加载和处理,这
《Android进阶之光》读书笔记
soleil雪寂
读书笔记 # Android进阶之光
文章目录第1章Android新特性1.1.Android5.0新特性1.2.RecyclerView1.1.4.3种Notification1.1.5.Toolbar与Palette1.1.6.Palette1.2.Android6.0新特性1.2.2.运行时权限机制1.3.Android7.0新特性第2章MaterialDesign2.2.DesignSupportLibrary常用控件详解第3
《Android进阶之光》— Android 书籍
王睿丶
Android 永无止境 《Android进阶之光》 Android书籍 Android phoenix 移动开发
文章目录第1章Android新特性1第2章MaterialDesign48第3章View体系与自定义View87第4章多线程编程165第5章网络编程与网络框架204第6章设计模式271第7章事件总线308第8章函数响应式编程333第9章注解与依赖注入框架382第10章应用架构设计422第11章系统架构与MediaPlayer框架460出版年:2017-7简介:《Android进阶之光》是一本And
《android进阶之光》——多线程编程(上)
TAING要一直努力
读书笔记
今天了解了下多线程编程,知识点如下:进程与线程:进程是什么?线程是什么?进程可以看作是程序的实体,是线程的容器,是受操作系统管理的基本运行单元,例如exe文件就是一个进程。线程是进程运行的一些子任务,是操作系统调度的最小单元,各线程拥有自己的计数器,堆栈,局部变量等,也可以访问线程间共享的内存。线程的状态有哪些?新创建,可运行,等待,超时等待,阻塞,终止怎么创建一个线程?-三种方法第一种,MyTr
android进阶之光!Android面试必备的集合源码详解,系列篇
程序员Sunbu
程序员 Android
前言面试:如果不准备充分的面试,完全是浪费时间,更是对自己的不负责。文末会给大家分享下我整理的Android面试专题及答案其中大部分都是大企业面试常问的面试题,可以对照这查漏补缺,当然了,这里所列的肯定不可能覆盖全部方式,不过对大家找工作肯定是有帮助!本月飞机到达上海,到今天第6天了,四家大公司华为,小米,映客,抖音,还有二家中小型公司。有几家已经面了几轮,下周还要面,挂了几家,不过目前已经选择了
Android-悬浮窗功能的实现(附Java、KT实现源码)(1)
egrhef
程序员 android java 开发语言
//获取服务的操作对象valbinder=serviceasFloatWinfowServices.MyBinderbinder.service}overridefunonServiceDisconnected(name:ComponentName){}}overridefunonActivityResult(requestCode:Int,resultCode:Int,data:Intent){
Visual Studio中的Android模拟器使用详解
wurui8
android android studio android android应用
关注微信号:javalearns随时随地学Java或扫一扫随时随地学JavaMicrosoft本周发布了VisualStudio2015预览版,里面包含Android开发工具.安装的时候,如果选Android开发,VisualStudio会把调试Android应用程序用的VisualStudio模拟器也装上.在介绍这个新模拟器之前,我们先来聊一聊,为什么需要一个新的Android模拟器–当然,你也
Unity 热更 之 【HybirdCLR】+【YooAsset】 [安卓 Android端] [代码 + 资源热更] 功能的 简单实现演示
仙魁XAN
Unity 进阶 unity HybirdCLR YooAsset HotUpdate 热更新
Unity热更之【HybirdCLR】+【YooAsset】[安卓Android端][代码+资源热更]功能的简单实现演示目录Unity热更之【HybirdCLR】+【YooAsset】[安卓Android端][代码+资源热更]功能的简单实现演示一、简单介绍二、HybridCLR三、YooAsset四、HybirdCLR引入工程五、YooAsset引入工程六、Python服务器简单构建七、Hybir
Android 用线程池实现一个简单的任务队列(Kotlin)
深海呐
Android # Android进阶 # Kotlin android kotlin 线程池 延时任务队列 线程池延时任务
关于线程池,Kotlin和java的使用方式一样在Android中,很多人喜欢用Handler的postDelayed()去实现延时任务.要使用postDelayed(),去实现延时任务队列,就不可避免要使用递归.但是这样做,代码的简洁性,和书写的简易,就远不如使用线程池.使用线程池的简单程度:privatevalmThreadPool=Executors.newSingleThreadSched
(小白入门)Windows环境下搭建React Native Android开发环境
码农老黑
前端 React Native 移动开发 Android studio
ReactNative(简称RN)是Facebook于2015年4月开源的跨平台移动应用开发框架,是Facebook早先开源的UI框架React在原生移动应用平台的衍生产物,目前支持iOS和Android两大平台。RN的环境搭建在RN的中文社区有所介绍,但是对于小白来说还是有些太过简略了。RN中文社区详见参考,本文不涉及的问题也许在其中能够有所解答。ReactNative思想底层引擎是JavaSc
Android Dialog圆角设置无效的问题
ly969434341
android
一,参考AndroidDialog圆角设置无效的问题https://blog.csdn.net/woshi_awei/article/details/99664527Android自定义Dialog实现通用圆角对话框https://cloud.tencent.com/developer/article/1740956二,原因Diallog的默认背景是白色(直角背景),我自定义的Dialog背景也是
MultiSnapRecyclerView:让Android RecyclerView的滚动停靠更灵活
技术无疆
Android android ui android studio android-studio java androidx
在Android应用开发中,RecyclerView是一个强大且灵活的组件,用于展示大量数据集合。然而,标准的RecyclerView只支持单一的滚动停靠点,这在某些场景下可能不够灵活。为了解决这个问题,TakuSemba开发了一个名为MultiSnapRecyclerView的库,它允许开发者在RecyclerView中实现多个滚动停靠点。文章目录什么是MultiSnapRecyclerView
Android界面特效全汇总
小飞鹤
Android开发详解 android
(一)Activity页面切换的效果Android2.0之后有了overridePendingTransition(),其中里面两个参数,一个是前一个activity的退出两一个activity的进入,Java代码1.@OverridepublicvoidonCreate(BundlesavedInstanceState){2.super.onCreate(savedInstanceState);
SQL的各种连接查询
xieke90
UNION ALL UNION 外连接 内连接 JOIN
一、内连接
概念:内连接就是使用比较运算符根据每个表共有的列的值匹配两个表中的行。
内连接(join 或者inner join )
SQL语法:
select * fron
java编程思想--复用类
百合不是茶
java 继承 代理 组合 final类
复用类看着标题都不知道是什么,再加上java编程思想翻译的比价难懂,所以知道现在才看这本软件界的奇书
一:组合语法:就是将对象的引用放到新类中即可
代码:
package com.wj.reuse;
/**
*
* @author Administrator 组
[开源与生态系统]国产CPU的生态系统
comsci
cpu
计算机要从娃娃抓起...而孩子最喜欢玩游戏....
要让国产CPU在国内市场形成自己的生态系统和产业链,国家和企业就不能够忘记游戏这个非常关键的环节....
投入一些资金和资源,人力和政策,让游
JVM内存区域划分Eden Space、Survivor Space、Tenured Gen,Perm Gen解释
商人shang
jvm内存
jvm区域总体分两类,heap区和非heap区。heap区又分:Eden Space(伊甸园)、Survivor Space(幸存者区)、Tenured Gen(老年代-养老区)。 非heap区又分:Code Cache(代码缓存区)、Perm Gen(永久代)、Jvm Stack(java虚拟机栈)、Local Method Statck(本地方法栈)。
HotSpot虚拟机GC算法采用分代收
页面上调用 QQ
oloz
qq
<A href="tencent://message/?uin=707321921&Site=有事Q我&Menu=yes">
<img style="border:0px;" src=http://wpa.qq.com/pa?p=1:707321921:1></a>
一些问题
文强chu
问题
1.eclipse 导出 doc 出现“The Javadoc command does not exist.” javadoc command 选择 jdk/bin/javadoc.exe 2.tomcate 配置 web 项目 .....
SQL:3.mysql * 必须得放前面 否则 select&nbs
生活没有安全感
小桔子
生活 孤独 安全感
圈子好小,身边朋友没几个,交心的更是少之又少。在深圳,除了男朋友,没几个亲密的人。不知不觉男朋友成了唯一的依靠,毫不夸张的说,业余生活的全部。现在感情好,也很幸福的。但是说不准难免人心会变嘛,不发生什么大家都乐融融,发生什么很难处理。我想说如果不幸被分手(无论原因如何),生活难免变化很大,在深圳,我没交心的朋友。明
php 基础语法
aichenglong
php 基本语法
1 .1 php变量必须以$开头
<?php
$a=” b”;
echo
?>
1 .2 php基本数据库类型 Integer float/double Boolean string
1 .3 复合数据类型 数组array和对象 object
1 .4 特殊数据类型 null 资源类型(resource) $co
mybatis tools 配置详解
AILIKES
mybatis
MyBatis Generator中文文档
MyBatis Generator中文文档地址:
http://generator.sturgeon.mopaas.com/
该中文文档由于尽可能和原文内容一致,所以有些地方如果不熟悉,看中文版的文档的也会有一定的障碍,所以本章根据该中文文档以及实际应用,使用通俗的语言来讲解详细的配置。
本文使用Markdown进行编辑,但是博客显示效
继承与多态的探讨
百合不是茶
JAVA面向对象 继承 对象
继承 extends 多态
继承是面向对象最经常使用的特征之一:继承语法是通过继承发、基类的域和方法 //继承就是从现有的类中生成一个新的类,这个新类拥有现有类的所有extends是使用继承的关键字:
在A类中定义属性和方法;
class A{
//定义属性
int age;
//定义方法
public void go
JS的undefined与null的实例
bijian1013
JavaScript JavaScript
<form name="theform" id="theform">
</form>
<script language="javascript">
var a
alert(typeof(b)); //这里提示undefined
if(theform.datas
TDD实践(一)
bijian1013
java 敏捷 TDD
一.TDD概述
TDD:测试驱动开发,它的基本思想就是在开发功能代码之前,先编写测试代码。也就是说在明确要开发某个功能后,首先思考如何对这个功能进行测试,并完成测试代码的编写,然后编写相关的代码满足这些测试用例。然后循环进行添加其他功能,直到完全部功能的开发。
[Maven学习笔记十]Maven Profile与资源文件过滤器
bit1129
maven
什么是Maven Profile
Maven Profile的含义是针对编译打包环境和编译打包目的配置定制,可以在不同的环境上选择相应的配置,例如DB信息,可以根据是为开发环境编译打包,还是为生产环境编译打包,动态的选择正确的DB配置信息
Profile的激活机制
1.Profile可以手工激活,比如在Intellij Idea的Maven Project视图中可以选择一个P
【Hive八】Hive用户自定义生成表函数(UDTF)
bit1129
hive
1. 什么是UDTF
UDTF,是User Defined Table-Generating Functions,一眼看上去,貌似是用户自定义生成表函数,这个生成表不应该理解为生成了一个HQL Table, 貌似更应该理解为生成了类似关系表的二维行数据集
2. 如何实现UDTF
继承org.apache.hadoop.hive.ql.udf.generic
tfs restful api 加auth 2.0认计
ronin47
目前思考如何给tfs的ngx-tfs api增加安全性。有如下两点:
一是基于客户端的ip设置。这个比较容易实现。
二是基于OAuth2.0认证,这个需要lua,实现起来相对于一来说,有些难度。
现在重点介绍第二种方法实现思路。
前言:我们使用Nginx的Lua中间件建立了OAuth2认证和授权层。如果你也有此打算,阅读下面的文档,实现自动化并获得收益。SeatGe
jdk环境变量配置
byalias
java jdk
进行java开发,首先要安装jdk,安装了jdk后还要进行环境变量配置:
1、下载jdk(http://java.sun.com/javase/downloads/index.jsp),我下载的版本是:jdk-7u79-windows-x64.exe
2、安装jdk-7u79-windows-x64.exe
3、配置环境变量:右击"计算机"-->&quo
《代码大全》表驱动法-Table Driven Approach-2
bylijinnan
java
package com.ljn.base;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.uti
SQL 数值四舍五入 小数点后保留2位
chicony
四舍五入
1.round() 函数是四舍五入用,第一个参数是我们要被操作的数据,第二个参数是设置我们四舍五入之后小数点后显示几位。
2.numeric 函数的2个参数,第一个表示数据长度,第二个参数表示小数点后位数。
例如:
select cast(round(12.5,2) as numeric(5,2))  
c++运算符重载
CrazyMizzz
C++
一、加+,减-,乘*,除/ 的运算符重载
Rational operator*(const Rational &x) const{
return Rational(x.a * this->a);
}
在这里只写乘法的,加减除的写法类似
二、<<输出,>>输入的运算符重载
&nb
hive DDL语法汇总
daizj
hive 修改列 DDL 修改表
hive DDL语法汇总
1、对表重命名
hive> ALTER TABLE table_name RENAME TO new_table_name;
2、修改表备注
hive> ALTER TABLE table_name SET TBLPROPERTIES ('comment' = new_comm
jbox使用说明
dcj3sjt126com
Web
参考网址:http://www.kudystudio.com/jbox/jbox-demo.html jBox v2.3 beta [
点击下载]
技术交流QQGroup:172543951 100521167
[2011-11-11] jBox v2.3 正式版
- [调整&修复] IE6下有iframe或页面有active、applet控件
UISegmentedControl 开发笔记
dcj3sjt126com
// typedef NS_ENUM(NSInteger, UISegmentedControlStyle) {
// UISegmentedControlStylePlain, // large plain
&
Slick生成表映射文件
ekian
scala
Scala添加SLICK进行数据库操作,需在sbt文件上添加slick-codegen包
"com.typesafe.slick" %% "slick-codegen" % slickVersion
因为我是连接SQL Server数据库,还需添加slick-extensions,jtds包
"com.typesa
ES-TEST
gengzg
test
package com.MarkNum;
import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.annotation
为何外键不再推荐使用
hugh.wang
mysql DB
表的关联,是一种逻辑关系,并不需要进行物理上的“硬关联”,而且你所期望的关联,其实只是其数据上存在一定的联系而已,而这种联系实际上是在设计之初就定义好的固有逻辑。
在业务代码中实现的时候,只要按照设计之初的这种固有关联逻辑来处理数据即可,并不需要在数据库层面进行“硬关联”,因为在数据库层面通过使用外键的方式进行“硬关联”,会带来很多额外的资源消耗来进行一致性和完整性校验,即使很多时候我们并不
领域驱动设计
julyflame
VO DAO 设计模式 DTO po
概念:
VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。
DTO(Data Transfer Object):数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,我泛指用于展示层与服务层之间的数据传输对
单例设计模式
hm4123660
java Singleton 单例设计模式 懒汉式 饿汉式
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
&nb
logback
zhb8015
log logback
一、logback的介绍
Logback是由log4j创始人设计的又一个开源日志组件。logback当前分成三个模块:logback-core,logback- classic和logback-access。logback-core是其它两个模块的基础模块。logback-classic是log4j的一个 改良版本。此外logback-class
整合Kafka到Spark Streaming——代码示例和挑战
Stark_Summer
spark storm zookeeper PARALLELISM processing
作者Michael G. Noll是瑞士的一位工程师和研究员,效力于Verisign,是Verisign实验室的大规模数据分析基础设施(基础Hadoop)的技术主管。本文,Michael详细的演示了如何将Kafka整合到Spark Streaming中。 期间, Michael还提到了将Kafka整合到 Spark Streaming中的一些现状,非常值得阅读,虽然有一些信息在Spark 1.2版
spring-master-slave-commondao
王新春
DAO spring dataSource slave master
互联网的web项目,都有个特点:请求的并发量高,其中请求最耗时的db操作,又是系统优化的重中之重。
为此,往往搭建 db的 一主多从库的 数据库架构。作为web的DAO层,要保证针对主库进行写操作,对多个从库进行读操作。当然在一些请求中,为了避免主从复制的延迟导致的数据不一致性,部分的读操作也要到主库上。(这种需求一般通过业务垂直分开,比如下单业务的代码所部署的机器,读去应该也要从主库读取数