shubo的博客

gopher/全干工程师

0%

诱导公式:

公式一:

  设α为任意角,终边相同的角的同一三角函数的值相等:

$sin(2kπ+α)=sinα$
$cos(2kπ+α)=cosα$
$tan(2kπ+α)=tanα$
$cot(2kπ+α)=cotα$

公式二:

  设α为任意角,π+α的三角函数值与α的三角函数值之间的关系:

  $sin(π+α)=-sinα$
  $cos(π+α)=-cosα$
  $tan(π+α)= tanα$
  $cot(π+α)= cotα$

公式三:

  任意角α与 -α的三角函数值之间的关系:

  $sin(-α)=-sinα$
  $cos(-α)= cosα$
  $tan(-α)=-tanα$
  $cot(-α)=-cotα$

公式四:

  利用公式二和公式三可以得到π-α与α的三角函数值之间的关系:
  $sin(π-α)= sinα$
  $cos(π-α)=-cosα$
  $tan(π-α)=-tanα$
  $cot(π-α)=-cotα$

公式五:

  利用公式一和公式三可以得到2π-α与α的三角函数值之间的关系:
  $sin(2π-α)=-sinα$
  $cos(2π-α)= cosα$
  $tan(2π-α)=-tanα$
  $cot(2π-α)=-cotα$

公式六:

  π/2±α与α的三角函数值之间的关系:
  $sin(π/2+α)= cosα$
  $cos(π/2+α)=-sinα$
  $tan(π/2+α)=-cotα$
  $cot(π/2+α)=-tanα$
  $sin(π/2-α)= cosα$
  $cos(π/2-α)= sinα$
  $tan(π/2-α)= cotα$
  $cot(π/2-α)= tanα$

诱导公式记忆口诀

  ※规律总结※

  上面这些诱导公式可以概括为:
  对于k•π/2±α(k∈Z)的个三角函数值,
  ①当k是偶数时,得到α的同名函数值,即函数名不改变;
  ②当k是奇数时,得到α相应的余函数值,即sin→cos;cos→sin;tan→cot,cot→tan.
  (奇变偶不变)
  然后在前面加上把α看成锐角时原函数值的符号.
  (符号看象限)
  例如:
  sin(2π-α)=sin(4•π/2-α),k=4为偶数,所以取sinα.
  当α是锐角时,2π-α∈(270°,360°),sin(2π-α)<0,符号为“-”.
  所以sin(2π-α)=-sinα
  上述的记忆口诀是:
  奇变偶不变,符号看象限.
  公式右边的符号为把α视为锐角时,角k•360°+α(k∈Z),-α、180°±α,360°-α
  所在象限的原三角函数值的符号可记忆
  水平诱导名不变;符号看象限.
  各种三角函数在四个象限的符号如何判断,也可以记住口诀“一全正;二正弦;三为切;四余弦”.
  这十二字口诀的意思就是说:
  第一象限内任何一个角的四种三角函数值都是“+”;
  第二象限内只有正弦是“+”,其余全部是“-”;
  第三象限内切函数是“+”,弦函数是“-”;
  第四象限内只有余弦是“+”,其余全部是“-”.
  上述记忆口诀,一全正,二正弦,三正切,四余弦

其他三角函数知识:

  ⒈同角三角函数的基本关系式

倒数关系:

  $tanα •cotα=1$
  $sinα •cscα=1$
  $cosα •secα=1$

商的关系:

  $sinα/cosα=tanα=secα/cscα$
  $cosα/sinα=cotα=cscα/secα$

平方关系:

  $sin^2(α)+cos^2(α)=1$
  $1+tan^2(α)=sec^2(α)$
  $1+cot^2(α)=csc^2(α)$

两角和差公式

  $sin(α+β)=sinαcosβ+cosαsinβ$
  $sin(α-β)=sinαcosβ-cosαsinβ$
  $cos(α+β)=cosαcosβ-sinαsinβ$
  $tan(α+β)=\frac{tanα+tanβ}{1-tanα •tanβ}$
  $tan(α-β)=\frac{tanα-tanβ}{1+tanα •tanβ}$

倍角公式

二倍角的正弦、余弦和正切公式,升幂缩角公式
  $sin2α=2sinαcosα$
  $cos2α=cos^2(α)-sin^2(α)
=2cos^2(α)-1
=1-2sin^2(α)$
  $tan2α=\frac{2tanα}{1-tan^2(α)}$

半角公式

  半角的正弦、余弦和正切公式(降幂扩角公式)
   $sin^2(\frac{α}{2})=\frac{1-cosα}{2}$
   $cos^2(\frac{α}{2})=\frac{1+cosα}{2}$
   $tan^2(\frac{α}{2})=\frac{1-cosα}{1+cosα}$

万能公式

  $sinα=\frac{2tan(\frac{α}{2})}{1+tan^2(\frac{α}{2})}$
  $cosα=\frac{1-tan^2(\frac{α}{2})}{1+tan^2(\frac{α}{2})}$
  $tanα=\frac{2tan(\frac{α}{2})}{1-tan^2(\frac{α}{2})}$   

万能公式推导

  附推导:
  $sin2α=2sinαcosα=\frac{2sinαcosα}{(cos^2(α)+sin^2(α))}$,
  (因为$cos^2(α)+sin^2(α)=1$)
  再把*分式上下同除$cos^2(α)$,可得$sin2α=2tanα/(1+tan^2(α))$
  然后用$\frac{α}{2}$代替α即可.
  同理可推导余弦的万能公式.正切的万能公式可通过正弦比余弦得到.

三倍角公式

  三倍角的正弦、余弦和正切公式
  $sin3α=3sinα-4sin^3(α)$
  $cos3α=4cos^3(α)-3cosα$
  $tan3α=\frac{3tanα-tan^3(α)}{1-3tan^2(α)}$
  
  三倍角公式推导
  附推导:
  $tan3α=\frac{sin3α}{cos3α}$
  $=\frac{(sin2αcosα+cos2αsinα)}{(cos2αcosα-sin2αsinα)}$
  $=\frac{(2sinαcos^2(α)+cos^2(α)sinα-sin^3(α))}{(cos^3(α)-cosαsin^2(α)-2sin^2(α)cosα)}$
  上下同除以$cos^3(α)$,得:
  $tan3α=\frac{(3tanα-tan^3(α))}{(1-3tan^2(α))}$
  $sin3α=sin(2α+α)=sin2αcosα+cos2αsinα$
  $=2sinαcos^2(α)+(1-2sin^2(α))sinα$
  $=2sinα-2sin^3(α)+sinα-2sin^2(α)$
  $=3sinα-4sin^3(α)$

  $cos3α=cos(2α+α)=cos2αcosα-sin2αsinα$
  $=(2cos^2(α)-1)cosα-2cosαsin^2(α)$
  $=2cos^3(α)-cosα+(2cosα-2cos^3(α))$
  $=4cos^3(α)-3cosα$
  即
  $sin3α=3sinα-4sin^3(α)$
  $cos3α=4cos^3(α)-3cosα$
  三倍角公式联想记忆
  记忆方法:谐音、联想
  正弦三倍角:3元 减 4元3角(欠债了(被减成负数),所以要“挣钱”(音似“正弦”))
  余弦三倍角:4元3角 减 3元(减完之后还有“余”)
  ☆☆注意函数名,即正弦的三倍角都用正弦表示,余弦的三倍角都用余弦表示.

和差化积公式

  三角函数的和差化积公式
  
  $sinα+sinβ=2sin\frac{α+β}{2}•cos\frac{α-β}{2}$
  
  $sinα-sinβ=2sin\frac{α-β}{2}•cos\frac{α+β}{2}$

   
  $cosα+cosβ=2cos\frac{α+β}{2}•cos\frac{α-β}{2}$
 
  
  $cosα-cosβ=-2sin\frac{α+β}{2}•sin\frac{α-β}{2}$

积化和差公式

  三角函数的积化和差公式
  $sinα •cosβ=0.5[sin(α+β)+sin(α-β)]$
  $cosα •sinβ=0.5[sin(α+β)-sin(α-β)]$
  $cosα •cosβ=0.5[cos(α+β)+cos(α-β)]$
  $sinα •sinβ=- 0.5[cos(α+β)-cos(α-β)]$

和差化积公式

  附推导:首先,我们知道
$sin(α+β)=sinα cosβ+cosα sinβ$
$sin(α-β)=sinα cosβ-cosα sinβ$
  我们把两式相加就得到
$sin(α+β)+sin(α-β)=2sinα cosβ$
  所以,
$sinα cosβ=\frac{sin(α+β)+sin(α-β)}{2}$
  同理,若把两式相减,就得到
$cosα sinβ=\frac{sin(α+β)-sin(α-β)}{2}$
  同样的,我们还知道
$cos(α+β)=cosα cosβ-sinα sinβ$,
$cos(α-β)=cosα cosβ+sinα sinβ$
  所以,把两式相加,我们就可以得到
$cos(α+β)+cos(α-β)=2cosα cosβ$
  所以我们就得到,
$cosα cosβ=\frac{cos(α+β)+cos(α-β)}{2}$
  同理,两式相减我们就得到
$sinα sinβ=-\frac{cos(α+β)-cos(α-β)}{2}$
  这样,我们就得到了积化和差的四个公式:
$sinα cosβ=\frac{sin(α+β)+sin(α-β)}{2}$
$cosα sinβ=\frac{sin(α+β)-sin(α-β)}{2}$
$cosα cosβ=\frac{cos(α+β)+cos(α-β)}{2}$
$sinα sinβ=-\frac{cos(α+β)-cos(α-β)}{2}$
  好,有了积化和差的四个公式以后,我们只需一个变形,就可以得到和差化积的四个公式.
  我们把上述四个公式中的α+β设为x,α-β设为y,那么
$α=\frac{x+y}{2}$,
$β=\frac{x-y}{2}$
  把α,β分别用x,y表示就可以得到和差化积的四个公式:
$sinx+siny=2sin\frac{x+y}{2} cos\frac{x-y}{2}$
$sinx-siny=2cos\frac{x+y}{2} sin\frac{x-y}{2}$
$cosx+cosy=2cos\frac{x+y}{2} cos\frac{x-y}{2}$
$cosx-cosy=-2sin\frac{x+y}{2} sin\frac{x-y}{2}$


基本性质
唯一一个同时为奇函数及偶函数的函数为其值为0的常数函数(即对所有x,f(x)=0)。
通常,一个偶函数和一个奇函数的相加不会是奇函数也不会是偶函数;如x+x2
两个偶函数的相加为偶函数,且一个偶函数的任意常数倍亦为偶函数。
两个奇函数的相加为奇函数,且一个奇函数的任意常数倍亦为奇函数。
两个偶函数的乘积为一个偶函数。
两个奇函数的乘积为一个偶函数。
一个偶函数和一个奇函数的乘积为一个奇函数。
两个偶函数的商为一个偶函数。
两个奇函数的商为一个偶函数。
一个偶函数和一个奇函数的商为一个奇函数
一个偶函数的导数为一个奇函数。
一个奇函数的导数为一个偶函数。
两个奇函数的复合为一个奇函数,而两个偶函数的复合为一个偶函数。
一个偶函数和一个奇函数的复合为一个偶函数。
注意
如果遇见判断题,没有排除f(x)=0这种情况,直接说明两个奇偶函数的关系,那么一定要仔细考虑到这种既是奇函数又是偶函数的情况。


转自青学哥哥的博客嘻嘻

原文:https://blog.csdn.net/qq_42443562/article/details/89047314

单词 含义
pattern 模式、方法
intranet 内联网
extranet 外联网
field 字段
flip-flop 触发器
amplifier 放大器
encapsulate 封装
cell 单元格、存储单元
portable 便携的
optimize 使优化的、完善的
retrieval 数据检索
allocation 分配
consolidate 加固、加强
deployment 布置、调度
reside 驻存
prompt 迅速的、提示
peripheral device 外部设备
process 进程、处理
component 组件、元件
multimedia 多媒体
interactivity 交互
animation 动画
monitor 显示器、监视
expression 表达式
decode 解码
encode 编码
hardware 硬件
software 软件
firmware 固件
HardDisc 硬盘
store 存储
memory 存储器、内存
instruction 指令
spreadsheet 电子表格
chip 芯片
performance 性能
measur 测量
term 术语
context 上下文
compatible 兼容的
separate 分离的
case 例子、用例/机箱
feature 特征
be dedicated to 致力于
purpose 目的
perform 执行
offline 脱机
presentation 报告
predecessor 前任、前身
successor 后继
estimate 估计
dominate 占据
plug and play 即插即用
plugin 插件
property 属性表
Activate 激活
script 脚本
synchronize 同步
signal 信号
deliver vt. 交付、发表 vi.实现、传送

缩写

单词 含义
RAM: Random Access Memory 随机存取存储器
ROM: Read-Only Memory 只读存储器
BIOS:Base Input Output System 基本输入输出系统
ADSL: asymmetric digital subscriber line 非对称数字用户环线
ALU: Arithmetic Logical Unit 算术逻辑单元
CPU: Central Processing Unit 中央处理器
AR:Augmented Reality 增强现实
VR:Virtual Reality 虚拟现实
JRE:Java Runtime Environment Java运行环境
OPT:Optimal Replacement Algorithm 最优置换算法

常见协议

单词 含义
TCP:Transmission Control Protocol 传输控制协议
IP:Internet Protocol Address 网际协议地址
HTTP:HyperText Transfer Protocol 超文本传输协议
FTP:File Transfer Protocol 文件传输协议
DNS:Domain Name System 域名系统
UDP :User Datagram Protocol 用户数据报协议
POP: Post Office Protocol 邮局协议
SNMP: Simple Network Management Protocol 简单网络管理协议

进制

单词 含义
8bit(b) 位 = 1Byte(B) 字节
Binary 二进制
Octonary 八进制
Decimal 十进制
Hexadecimal 十六进制

数据大小

单词 含义
Kilo 千字节
Mega
Gega 吉兆
Tera 太兆
Peta 千兆
Exa 千兆兆


转自 https://www.cnblogs.com/r-decade/p/5827841.html

ListView

  显示大量相同格式数据

常用属性:

方法 说明
listSelector listView每项在选中、按下等不同状态时的Drawable
divider ListView每项间的间隔Drawable
dividerHeight ListView每项间间隔的间隔高度

常用方法:

方法 说明
setAdapter() 设置数据适配器
setOnItemClickListener() 设置每项点击事件监听
addHeaderView() 添加头视图
addFooterView() 添加脚视图
setEmptyView() 设置数据项为0时的空数据视图

监听事件

      这个监听的例子是设置了一个头视图 项的下标改变 所以用 position-listview.getHeaderViewsCount() 计算项的下标位置 获取正确的对象

Adapter数据适配器

将各种数据以合适的形式绑定到控件上 像listview, gridview, spinner 等等等控件 都会用到Adapter绑定数据

介绍三种Adapter

ArrayAdapter:支持泛型操作,最简单的一个Adapter,只能展现一行文字

SimpleAdapter:同样具有良好扩展性的一个Adapter,可以自定义多种效果

BaseAdapter:抽象类,实际开发中我们会继承这个类并且重写相关方法,用得最多的一个Adapter

先从简单的介绍

1.ArrayAdapter

显示效果 绑定了listview

2.SimpleAdapter

  simpleAdapter的扩展性最好,可以定义各种各样的布局出来,可以放上ImageView(图片),还可以放上Button(按钮),CheckBox(复选框)等等

显示结果

3.BaseAdapter

BaseAdapter是开发中最常用的适配器ArrayAdapter, SimpleAdapter 都继承于BaseAdapterBaseAdapter可以完成自己定义的Adapter,可以将任何复杂组合的数据和资源,以任何你想要的显示效果展示给大家。

继承BaseAdapter之后,需要重写以下四个方法:getCount,getItem,getItemId,getView。

系统在绘制ListView之前,将会先调用getCount方法来获取Item的个数。每绘制一个Item就会调用一次getView方法,在getView中引用事先定义好的layout布局确定显示的效果并返回一个View对象作为一个Item显示出来。

这两个方法是自定ListView显示效果中最为重要的,同时只要重写好了这两个方法,ListView就能完全按开发者的要求显示。而getItem和getItemId方法将会在调用ListView的响应方法的时候被调用到。

自定义布局文件(listview的项的显示效果)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<ImageView
android:id="@+id/image_photo"
android:layout_width="70dp"
android:layout_height="70dp"
android:padding="10dp"/>
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20dp"
android:layout_toRightOf="@id/image_photo"/>
<TextView
android:id="@+id/age"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20dp"
android:layout_toRightOf="@id/image_photo"
android:layout_below="@id/name"
android:layout_marginTop="10dp"/>
</RelativeLayout>

student学生类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

public class Student {
private String name;
private int age;
private int photo;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public int getPhoto() {
return photo;
}

public void setPhoto(int photo) {
this.photo = photo;
}
}

MainActivity

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

public class MainActivity extends AppCompatActivity {

private ListView listView;
  //自定义BaseAdapter
private MyAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView= (ListView) findViewById(R.id.listview);
List<Student> stuList=new ArrayList<>();
for(int i=0;i<10;i++){
Student stu=new Student();
stu.setAge(10+i);
stu.setName("name"+i);
stu.setPhoto(R.mipmap.ic_launcher);
stuList.add(stu);
}
      
adapter=new MyAdapter(stuList,MainActivity.this);
listView.setAdapter(adapter);
}

MyAdapter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

public class MyAdapter extends BaseAdapter {

private List<Student> stuList;
private LayoutInflater inflater;
public MyAdapter() {}

public MyAdapter(List<Student> stuList,Context context) {
this.stuList = stuList;
this.inflater=LayoutInflater.from(context);
}

@Override
public int getCount() {
return stuList==null?0:stuList.size();
}

@Override
public Student getItem(int position) {
return stuList.get(position);
}

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
//加载布局为一个视图
View view=inflater.inflate(R.layout.layout_student_item,null);
Student student=getItem(position);
//在view视图中查找id为image_photo的控件
ImageView image_photo= (ImageView) view.findViewById(R.id.image_photo);
TextView tv_name= (TextView) view.findViewById(R.id.name);
TextView tv_age= (TextView) view.findViewById(R.id.age);
image_photo.setImageResource(student.getPhoto());
tv_name.setText(student.getName());
tv_age.setText(String.valueOf(student.getAge()));
return view;
}

显示结果

jizhi生活要结束了,,加油。。。


转自https://www.cnblogs.com/hh9601/p/6404728.html # 异常信息:
1
Caused by: java.lang.IllegalStateException: This Activity already has an action bar supplied by the window decor. Do not request Window.FEATURE_SUPPORT_ACTION_BAR and set windowActionBar to false in your theme to use a Toolbar instead.
# 问题原因:

当在有activity中调用了setSupportActionBar(toolbar);
而当前使用的主题为默认,或者带默认ActionBar的主题

当在activity中调用了setSupportActionBar(toolbar);

同时,AndroidManifest.xml 对应的Activity标签的android:theme

<android:theme="@style/AppTheme" >

且,style资源文件中的parent为parent="Theme.AppCompat.Light.DarkActionBar

就会报这个异常。

解决方法:

style.xml中加入:

Manifest.xml中,修改theme


原帖链接

之前写过一个教程。。关于如何安装Android Studio的但是好像随着新版本的推送。原先的教程又不是很适用了。这里写一些现在安装时的注意事项:

在之前的帖子中使用了sdkManager来提前下载sdk是为了提前准备sdk。AndroidStudio过程中会有sdk下载的过程。所以sdkmanager下载sdk的过程可以省略。

AndroidStudio3.2安装包 百度网盘: 提取码:wbbp

常见问题

  1. Java环境(详情看[原贴](http://blog.shubo6.cn
    /2018/12/23/AndroidStudio%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE%EF%BC%88Windows%EF%BC%89/))
  2. 安装完成后,去掉默认的jdk默认勾选的选项,将目录设置为你的之前配置的jdk目录。
  3. 近期最新版本的依赖抽风,如果出现以下情况。 手动将最新29版本改成28即可
  4. 有的电脑在初始化加载gradle时, 会因为网络状况加载失败。然后就重试或者重新加载时,会显示链接地址无效。 这个时候可以尝试修改gradle-wrapper.properties配置文件
    将原先默认的https的连接修改为http
  5. 修改或添加了工程中一些文件,比如图片等文件时,重新构建项目。


学习安卓有一段时间了。。。菜的难受,一直不知道怎么封装耗时操作的方法。只会现用现开线程。下面记录今天学会的方法:

场景重现:

当我们频繁需要网络耗时操作的时候,例如http请求json数据,由于安卓不允许主线程耗时操作的机制,导致我们每次请求数据的时候都需要开启子线程,并且还要考虑线程之间通信、同步、异步等问题。非常繁琐。

解决方法:

由于Http请求Json的形式比较固定。

封装思路为:

类似`JQuery`中的`ajax`的使用方法,传入参数为`url`和`Json`字符串。返回值则是从`Http`中请求下来的`Json`字符串。

注意事项:

首先不要忘记在AndroidManifest.xml中添加网络权限

<uses-permission android:name="android.permission.INTERNET"/>

我使用okhttp3的这个http框架。相比原生的请求方式代码可以短很多。

代码:

MyHandler:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package com.example.a81418.countrymap.HttpRequestUtils;

import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.widget.Toast;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class MyHandler extends Handler {
private Context context;
private DataCallBack callBack;
public MyHandler() {
}

public MyHandler(Context context, DataCallBack callBack) {
this.context = context;
this.callBack = callBack;
}

public void getDataFromServer(Context context, RequestBean bean, DataCallBack callBack){
MyHandler handler=new MyHandler(context,callBack);
MyTask task=new MyTask(bean,handler);
//获取CPU数量
int cpunum = Runtime.getRuntime().availableProcessors();
//线程池实例化
ExecutorService service = Executors.newScheduledThreadPool(cpunum + 1);
//将子线程放入线程池执行;
service.execute(task);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
int what = msg.what;
if(what==200){
String json= (String) msg.obj;
callBack.prosseData(json);
} else {
Toast.makeText(context, "请求失败!"+what, Toast.LENGTH_SHORT).show();
}
}



public abstract interface DataCallBack{
public abstract void prosseData(String json);
}

}

handler主要负责接受来自线程发送的message,并开启线程池。

MyTask:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package com.example.a81418.countrymap.HttpRequestUtils;

import android.os.Message;
import android.util.Log;

import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class MyTask extends Thread {
private RequestBean requestBean;

private MyHandler handler;
public MyTask(RequestBean requestBean, MyHandler handler) {
this.requestBean = requestBean;
this.handler = handler;
}

@Override
public void run() {
super.run();
OkHttpClient client=new OkHttpClient();
final Request request = new Request.Builder()
.url(requestBean.url)
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}

@Override
public void onResponse(Call call, Response response) throws IOException {
String htmlStr = response.body().string();
Message message=Message.obtain();

if (response.code()==200){
message.what=response.code();
message.obj=htmlStr;
handler.sendMessage(message);
}else {
message.what=response.code();
handler.sendMessage(message);
}
Log.e("MyTask", "onResponse: "+htmlStr );
}
});
}
}

MyTask继承了thread,将http请求的具体操作,以及请求成功或失败后返回结果的操作,放在继承的run()方法中。

RequestBean:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package com.example.a81418.countrymap.HttpRequestUtils;

public class RequestBean {
public String url;
public String json;
public String method="POST";

public RequestBean(String url, String json) {
this.url = url;
this.json = json;
}

public RequestBean() {
}

public String getUrl() {
return url;
}

public void setUrl(String url) {
this.url = url;
}

public String getJson() {
return json;
}

public void setJson(String json) {
this.json = json;
}

public String getMethod() {
return method;
}

public void setMethod(String method) {
this.method = method;
}
}

RequestBean自定义的请求bean类。一目了然。没的说。

运行截图

纪念一下success的喜悦。


今天使用fragment时,抛出了ClassCastException异常。顺手记录下解决方法。

android.support.v4.app.Fragmentandroid.app.Fragment区别,原因是因为使用的module中的Fragment与我自己创建的Fragment导入的包不一致。

解决方法是导入相同的包。

以下摘自CSDN博客作者:巨大蟹
原文:https://blog.csdn.net/lin353809836/article/details/53717153

1.最低支持版本不同

android.app.Fragment 兼容的最低版本是android:minSdkVersion="11" 即3.0版

android.support.v4.app.Fragment 兼容的最低版本是android:minSdkVersion="4" 即1.6版

2.需要导jar包

fragment 在定义的时候,要导入的包不同

android.support.v4.app.Fragment 需要引入包android-support-v4.jar

android.app.Fragment 需要导入的是android-app.jar

3.继承的父类不同,在fragmentManager和在Activity中取的方法不同

android.support.v4.app.Fragment使用  fragmentManager=getSupportFragmentManager()获得 ,并且当前的类必须继FragmentActivity

android.app.Fragment使用 fragmentManager=getFragmentManager() 获得  ,继承Activity即可。

4.标签的使用情况(这点最重要了,也是决定你到底使用v4包中的Fragment还是app包的fragment

v4包中的FragmentActivity的布局中是可以使用<fragment>标签的,有些博客中也叫静态地载入fragment

android.app.Fragment在Activity布局中是不可以使用<fragment>标签的,需要在程序中通过add或者replace的方式添加。

总结起来就是:当这个Activity的布局中有fragment标签的时候,这个Activity必须继承FragmentActivity,也就是使用V4包的fragment,否则就会抛出android.view.InflateException: Binary XML file line #69: Error inflating class fragment异常。

题外话:

我们使用Fragment的时候,选择哪个包下的Fragment呢?

到底是用Android.app下的Fragment还是用的android.support.v4.app包下的Fragment?

我们都知道Fragment3.0(API 11)后引入的,那么如果开发的app需要在3.0以下的版本运行呢?比如还有一点点市场份额的2.3!

于是乎,v4包就这样应运而生了,而最低可以兼容到1.6版本!

至于使用哪个包看你的需求了,现在3.0下手机市场份额其实已经不多了,随街都是4.0以上的,所以这个时候,你可以直接使用app包下的Fragment,然后调用相关的方法
通常都是不会有什么问题的;如果你Fragment用了app包的,FragmentManager和FragmentTransaction都必须是app包的


最近review了大一时候的期末实训学籍管理系统的代码。 发现自己并不明白多文件之间的变量定义和声明,在这里做个记录。 建议使用codeblocks

让我们来看看程序是咋写的

文件目录结构

1
2
3
4
5
6
7
8
9
主菜单   menu.c
成绩输入 stu1.c :在文件stu.dat中增加一个或多个新的学生和相应的成绩;
成绩修改 stu2.c :对已有学生的成绩进行修改;
查询成绩 stu3.c :根据学号或者姓名查询成绩;
显示成绩 stu4.c :显示所有学生的成绩(每页10个);
统计成绩 stu5.c :对所有学生的成绩,可以按照某一科进行升序排序;
注销学生 stu6.c :注销某学生及其相关记录;
成绩导入 stu7.c :将已经在其他文件里的学生成绩,导入到学生成绩数据文件;
整个系统 mscore.c

mscore.c (main)

1
2
3
4
5
6
7
8
9
10
11
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<string.h>
#include "my.h"
int BFUN=0;/* 定义全局变量,用来显示学籍信息个数 */
void main()
{
system("color 3f");
OI();
}

my.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#ifndef MY_H_INCLUDED
#define MY_H_INCLUDED
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<string.h>
#define NUMBER 200
extern int BFUN;
struct stu
{
char name[50];/* 姓名 */
unsigned long num;/* 学号 */
int math;/* 数学 */
int physical;/* 物理 */
int english;/* 英语 */
int count; /* 总分 */

}boy[NUMBER],Temp;

/* 定义函数说明(全局说明) */
void INPUT();/* 1.输入学生信息 */

int QUERY(int q);/* 2 查询学生信息 */

void CHANGE();/* 3 修改学生信息 */

void DELETION();/* 4 删除学生信息 */

void SEQUENCE();/* 5 排列学生信息 */

void SHOW();/* 6 显示学生信息 */

void SAVE();/* 7 保存学生信息 */

void LAYIN();/* 9 导入信息 */

void LOGOUT();/* 退出程序界面 */

void OI();/* 操作选项 */

void OUTPUT(int i);/* 输出信息 */

void XG(int k);/* 修改信息调用 */
#endif // MY_H_INCLUDED

stu1.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include "my.h"
void INPUT()/* 1.输入学生全部信息 */
{
int i;
int x;
printf("\n\t\t* * * * * * * * * * * * * * * * >* * * * *\n");
printf("\n\t\t* 你已进入学生信息录入模块 > *\n");
printf("\n\t\t* * * * * * * * * * * * * * * * >* * * * *\n");
x=BFUN;
while(1)/* 把全局变量BFUN的值赋给x */
{

printf("\t请输入第%d个学生的信息(键入‘0’退出>录入)\n",++x);
printf("\n\t录入信息包含项【学号,姓名,数学,>物理,外语,总成绩】回车键入下一项”\n");
printf("\n学号:");
scanf("%d",&Temp.num);
if(Temp.num==0)
{
system("cls");
break;
}
for(i=0;i<=BFUN;i++)
if(Temp.num==boy[i].num)
{
system("cls");
printf("\n\n\t该学籍已被注册!\n\n")>;INPUT();
}
getchar();
printf("\n姓名:");
scanf("%s",&Temp.name);
if(strlen(Temp.name)>20)/* 限制姓名字符长度>为20 */
{
system("cls");
printf("\n\n\t姓名输入有误,超出限度。>\n\n");INPUT();
}
printf("\n数学成绩:");
scanf("%d",&Temp.math);
if(Temp.math<=0||Temp.math>=150)
{
system("cls");
printf("\t成绩输入有误!\n\n\n");
INPUT();
}
printf("\n物理成绩:");
scanf("%d",&Temp.physical);

if(Temp.physical<=0||Temp.physical>=100)
{
system("cls");
printf("\t成绩输入有误!\n\n\n");
INPUT();
}
printf("\n外语成绩:");
scanf("%d",&Temp.english);
if(Temp.english<=0||Temp.english>=150)
{
system("cls");
printf("\t成绩输入有误!\n\n\n");
INPUT();
}
getchar();
BFUN=x;/* 上面函数完全正确执行后,才会把现在的>x值赋给BFUN */
printf("\n\n\n");

boy[BFUN-1]=Temp;
}
}

到这里就能直观的看出来 多个文件之间的调用关系:将结构体声明,函数声明,常量定义都写在一个自定义头文件里;然后在每一个文件中都include这个头文件就可以将功能模块化的分成多个文件啦。

还有一个问题就是extern的用法:

在主文件中定义了一个BFUN的全局变量,用来计算系统中学生的数量。
而在当头文件,或者其他文件中想要访问这个变量就不需要再次定义了。这时候在别的地方需要声明的时候,只需要使用extern就ok了

项目源码下载


Window 下配置MongoDB

运行安装程序将MongoDB安装到d:\mongodb目录下

创建文件夹d:\mongodb\data\db、d:\mongodb\data\log,分别用来安装db和日志文件,在log文件夹下创建一个日志文件MongoDB.log,即d:\mongodb\data\log\MongoDB.log

在D:\MongoDB\bin文件处打开命令行窗口(按住shift点击鼠标右键,选择打开)

输入: mongod -dbpath "d:\mongodb\data\db" 初始化启动服务并指定db数据存放在d:\mongodb\data\db

这个时候不要关闭窗口,默认MongoDB监听的端口是27017,此窗口是MongoDB临时启动的一个进程。

此时再打开一个窗口 执行mongo.exe 即可进入MongoDB的交互模式

当刚才的mongod窗口被关闭时,mongo.exe 就无法连接到数据库了,因此每次想使用mongodb数据库都要开启mongod.exe程序,所以比较麻烦,此时我们可以将MongoDB安装为windows服务

 还是运行cmd,进入bin文件夹,执行下列命令

1
2
d:\mongodb\bin>
mongod --dbpath "d:\mongodb\data\db" --logpath "d:\mongodb\data\log\MongoDB.log" --install --serviceName "MongoDB"

 这里MongoDB.log就是开始建立的日志文件,–serviceName “MongoDB” 服务名为MongoDB

启动、暂停、卸载服务

启动 net start MongoDB

停止 net stop MongoDB

卸载服务

    d:\mongodb\bin>mongod --dbpath "d:\mongodb\data\db" --logpath "d:\mongodb\data\log\MongoDB.log" --remove --serviceName "MongoDB"      

MongoDB导入数据

例:

mongorestore -h 127.0.0.1 -d employ --dir D:\dbbackup\employ\