1.引包时不小心点到了自动引包导致产生了包内类重复的错误
解决方法:
方法一:在App的gradle properties这个属性中将依赖注释就能还原了
dependencies
方法二:找到错误里面相关重复类的位置,然后把类去掉
2.android sync是什么:
首先引入Gradle的概念
Gradle官方定义:
Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置。
Gradle,它是一个基于JVM的新一代构建工具,关于Gradle完全可以写一本书,这个系列会针对Android开发来对Gradle的知识进行精简讲解。Gradle目前已经应用于多个Android开发的技术体系中,比如构建系统、插件化、热修复和组件化等等,如果你不了解Gradle,那么你对于上述技术体系的了解会大打折扣。为了让大家能够更好的学习Gradle,这篇文章不会介绍Gradle具体的技术细节,而是先介绍为什么现在要用Gradle?
1.项目自动化
Gradle是一个构建工具,那么为什么要用构建工具,这就需要先从项目自动化开始讲起。
在我们开发软件时,会面临相似的情况就是,我们需要去用IDE来进行编码,当完成一些功能时会进行编译、单元测试、打包等工作,这些工作都需要开发人员手动来实现。而一般的软件都是迭代式开发的,一个版本接着一本版本,每个版本又可能有很多的功能,如果开发每次实现功能时都需要手动的进行编译、单元测试和打包等工作,那显然会非常耗时而且也容易出现问题,因此项目自动化应运而生,它有以下优点:
- 它可以尽量防止开发手动介入从而节省了开发的时间并减少错误的发生。
- 自动化可以自定义有序的步骤来完成代码的编译、测试和打包等工作,让重复的步骤变得简单。
- IDE可能受到不同操作系统的限制,而自动化构建是不会依赖于特定的操作系统和IDE的,具有平台无关性。
2.构建工具
构建工具用于实现项目自动化,是一种可编程的工具,你可以用代码来控制构建流程最终生成可交付的软件。构建工具可以帮助你创建一个重复的、可靠的、无需手动介入的、不依赖于特定操作系统和IDE的构建。这么说可能有些抽象,这里拿APK的构建过程来举例。
原文链接:https://blog.csdn.net/xuwei_net/article/details/88787265
所以改了gradle就要sync同步一下!!!
3.调试打印Log.d(tag ,msg );
tag为标识符,到 logcat 里面添加筛选
直接填入我们想要筛选出的tag即可得到我们需要打印出的信息:
4.将字符串数组转换成字符串
方法一:遍历法
StringBuffer temp = new StringBuffer();//得到的是一个长字符串型(不换ASII字符)
for (int s : m) {temp.append(s);}
Log.d(“exy”, “666:”+ temp );
Arrays.toString(result),返回一个带括号和逗号隔开的字符串
//整型转字符数组
char c[]= new char[text.length];
for(int i = 0; i < text.length; i++)
c[i] =(char)m[i];
//整型转字符串
String c = “”;//赋初值
for(int i = 0; i < text.length; i++)
c=c+(char)m[i];
方法二:调 StringUtils 类
StringUtils.join(result);
方法三:
5.字符串转换为字符数组
text.toCharArray()------的到的是一个数组,可以直接使用下标
6.导入图片报错
原因:图片格式与图片数据不匹配———即图片格式后缀名被手动修改过,通过软件修改格式即可
或者名字有问题,重新修改名字
7.str.substring方法切割字符串
使用str.substring方法切割字符串的时候要注意字符串结尾比较特殊,在该地方转整型数的时候要注意容易闪退,可利用replace的方法増加一个数,然后忽略最后一位数
还有一个就是注意在字符型数字转整型数字时要注意不能有数字之外的符号,要不然转不了就会闪退报错
8.在 handler 里面操作控件空指针报错
原代码如下:(此处代码省略,只留了问题,方便查看)
public class MainActivity extends AppCompatActivity {
//图像控件初始化
private ImageView IT_Display;
//文本控件初始化
private TextView textView=null;
public Handler myHandler = new Handler(Looper.myLooper())
{
public void handleMessage(Message msg)
{
super.handleMessage(msg);
switch (msg.what)
{
case 1:
textView.setText("ok!!!");
break;
default:
textView.setText("!");
break;
}
}
};
@Override//函数重写
protected void onCreate(Bundle savedInstanceState) {
//通过Bundle参数中保存的数值来恢复活动被系统撤销前的一些参数
super.onCreate(savedInstanceState);
//为当前的activity引入一个activity_main的布局
setContentView(R.layout.activity_main);
IT_Display = findViewById(R.id.IT_Display);
TextView textView = findViewById(R.id.textView);
}
}
首先我是明确给控件指明了id的,因为是第一次用handler,这里面一直想不明白为什么在handler里面用不了,网上找了各种方法也没有什么效果…最后忽然看到
我这里居然是重新声明了一个控件而并不是在handler的问题,也没有给上面声明的 textview 控件指明id,本来知识想随便测试一下,然后id就没改,可能我不小心按到tab了,偷懒害人啊偷懒害人!!!!!
9.今天打中文的时候忽然打字只能打繁体字了,莫名其妙
解决方法:ctrl+shift+F切换回简体中文就行
10.通过try()catch()抛出代码异常
Exception 是程序正常运行过程中可以预料到的意外情况,并且应该被开发者捕获,进行相应的处理。
Exception 可以以两种方式出现:一是发生在程序编译时或运行时发生异常,是被程序抛出,用户没有主动抛出异常;二是用户主动抛出异常,使用throw关键字主动抛出异常。该异常可以是业务逻辑的异常
一、预期异常
对于Exception的直接子类,我们称之为编译时异常/受检异常/受控异常
catch的异常由自己预期的并合理写入代码里面,如果不是自己预期的异常,如果预期错误不正确将抛出其系统自己反射出的异常,比如下面:
我要抛出的是一个数组索引越界异常,但预期异常是强制转换异常,故不会抛出我自己的预期异常
所以我们应该更改异常捕捉的类型:ArrayIndexOutOfBoundsException
这样就正确抛出了我们预期的异常
二、非预期异常
当然使用Exception也是可以抛出,因为ArrayIndexOutOfBoundsException是Exception的子类
黑色字体可以认为只是凑数的而已。
对于Exception的直接子类,我们称之为编译时异常/受检异常/受控异常;
对于RunTimeException的直接子类,我们称之为运行时异常/非受控异常/非受检异常;
主要异常类型如下:
ArithmeticException:算术异常,常见的发生原因是在除数为0时。
ClassCastException:类转换异常,常见的发生原因是在多态发生转换时。
NumberFormatException:数字初始化异常,常见的发生原因是在字符串转换为数字时。
IndexOutOfBoundsException:数字越界异常,常见的发生原因是在遍历数组时。
NullPointException:空指针异常,常见的发生原因是在对象.方法名,对象为null时。
ClassNotFoundException:类未找到异常,常见的发生原因是在载入类时。
11.Socket端口传递需要注意的问题
在使用socket发送和接收数据报时怕防止端口占用闪退我想传递套接字,发现套接字传递后本身会关闭,
等于新建了一个socket给传递对象并关闭本身socket
if (rUdpSocket != null && rUdpSocket.getLocalPort() == clientport) {
//判断到接收端口占用就直接用接收端口发送
sUdpSocket = rUdpSocket;
}
socket数据报发送需要在线程中发送,否则会闪退
new Thread() {
public void run() {
//发送数据报
try {
sUdpSocket.send(datagramPacket);
sUdpSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();