1、Android Studio 的光标变粗之后想变回来的话就点击键盘上的“Insert”按键进行切换;
2、设置复制代码的快捷键是:CTRL+D就行
3、在studio中的代码的上下移动快捷键是:CTRL+shift+↑或者↓;组合按键
4、Error:Execution failed for task ':app:buildInfoDebugLoader'.
> Exception while doing past iteration backup : Source /home/ruiqin/AndroidStudioProjects/DouTuGaoShou/app/build/intermediates/builds/debug/5818437215551/classes.dex and destination
/home/ruiqin/AndroidStudioProjects/DouTuGaoShou/app/build/intermediates/builds/debug/5818437215551/classes.dex must be different
以上在studio中出现的异常问题的原因:是studio在不断更新过程中升级导致的工程编译异常;
解决方案:在选项栏里有点击build→RebuildProject选项重新加载编译工程就OK了;
5、js5.0提供了一组atomic class来帮助我们简化同步处理,属于java多线程开发,提高线程安全性和处理高并发同步(普通的自增模式变量会在被多个对象调取时出现计数失误);
6、屏幕默认单位是像素px,而在代码中所定义的测量单位是dp,所以在自定义view中其计算公式是:px/密度比+0.5f=dp
dp*密度比+0.5f=px
(备注:密度比是Context.getRescouces().getDisplayMatrics().density)
7、关于inflatingexception的填充异常解决方案:一般情况下;都是因为你在xml布局文件中所定义的view节点书写是否正确?
如果正确那么你再看一下是否有自己自定义的控件?
--有的话就需要去检查该自定义控件中的构造方法是否重写正确,引用的包名是否正确;
8、泛型的应用:什么是泛型?---首先它是java1.5提供的新特性,可以定义标识类中某个属性的类型;
作为某个方法的返回值类型;
作为某些函数方法或者类中的参数类型;
注意:在不确定的情况下,泛型的用处就是显而易见,他就是一个容纳各种类型的泛指;
9、mvp设计模式的基本概念和理解:
Module ↔ presenter ↔ view
module:准确的说是数据处理加工厂(内部依据的是类似于三级缓存的数据处理策略、所有view层请求和发送的数据都是由module来进行解析和操作的,不需要view自身做处理,只需要view等待module进行数据处理后返回的结果),所以说module不仅仅是实体类的集合,同时也是包含关于数据处理操作、增删改查、获取、分发、解析、存储等行为逻辑;
presenter:主持者,它是一个夹在module和view之间的中间层联系人,有承上启下的作用,类似于对外进行返回数据结果的接口参数传递,view根据需要发出的命令经由presenter交还给module处理,再将module处理后的数据结果返回给需要的view;内部的具体业务逻辑就是封装一些负责刷新view的代码,开启线程处理耗时操作的代码;
view:用户直接交互的界面,只是起到一个展示数据和效果的作用,一个view可以同时拥有多个presenter,也可以只有一个presenter。与Activity和fragment相关的各种数据填充适配器Adapter也是放在view层的;
10、EventBus使用:
1、首先创建一个处理要发布的信息的实用类(类似于set和get的bean类);
2、因为其框架是基于广播类的组件进行的组件间通信的机制,需要在订阅该事件的对象内注册该事件,
3、产生的事件消息和数据需要在相关的对象内发送相关的消息和数据;
4、处理消息;该框架是利用注解的方式进行的处理消息的操作:但是需要注意的就是该被处理的消息需要在哪个线程进行更新和提示--这框架内部封装了这么几个线程模式:PostThread(默认)、MainTread、BackgroundThread、Async。
PostThread--默认线程,哪发消息哪就收(相同线程发与收);
MainThread--主线程,不论哪发消息都在UI执行(可以更新UI,但是不能做耗时操作);
BackgroundThread--后台线程,在主线程就开启子线程执行消息,不在主线程则直接在执行的当前线程运行处理消息(禁止在该线程中进行UI更新);
Async--异步线程,不论在哪个线程发布,该事件处理时均在新建的子线程执行(禁止执行UI更新操作);
11、对于两个fragment之间的跳转问题的解决方案:
(针对在跳转到另一个fragment时按返回键的处理):
如果在当前页面fragmentA想跳转到fragmentB时---首先在fragmentA类的OnCreateView()方法内输入以下的代码实现:
View view = inflater.inflate(R.layout.fragment_conversation_list, container,false);
view.setFocusableInTouchMode(true);
view.requestFocus();
view.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode==event.KEYCODE_BACK){
HomeFragment homeFragment = new HomeFragment();
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fl_bottom,homeFragment).commit();
return true;
}
return false;
}
});
12、对于谷歌官方提供的API管理类:ConnectivityManager(网络连接管理类)
用途是:负责监听网络连接的状态,并发送状态变化的广播;向应用提供一些控制接口,它是作为ConnectivityService的一层包装,实际功能实现是在ConnectivityService中。
13、序列化(Serializable和Parcelable)
什么是序列化?--序列化,表示将一个对象转换成可存储可传输的状态,序列化后的对象可以在网络上进行传输,也可以在本地进行存储;
Serializable与Parcelable的区别---前者是java内部封装的API,将对象进行序列化的操作然后进行数据的传输存储;而后者是属于Android内部的API,不同的是后者是把对象拆分,分解成各种类型的数据,这样也就实现了传递对象的功能了,
好处:Parcelable--永久性保存对象,保存对象的字节序列到本地文件中;通过序列化对象在网络中传递对象;通过序列化在进程间通信;建议使用Parcelable进行序列化对象,因为其在内存方面比Serializable性能好,防止后者调取过多的临时变量时引起频繁GC;
什么时候用:需要在多个Activity和Fragment中进行传递数据可以使用intent直接进行通信(如数字、字符串等简单类型的传递)(这样的情况可以直接用intent来进行处理传递),但是如果是复杂类型则必须实现Parcelable接口进行数据传递;
14、GET和Post请求的区别 :
Get是向服务器发索取数据的一种请求,而Post是向服务器提交数据的一种请求。
Get是获取信息,而不是修改信息,
15、SharedPreference(Android四大存储方式之一),优点是:1、不用像创建数据库那样需要创建表、创建对象、写增删改查的语句来进行对数据的存储河北调取;
2、创建和调用方便,操作简单、代码简洁;
缺点 :只能支持基本数据类型的传递和存储;(例如int、boolean、string、float、long)
注意事项:需要通过上下文调取getSystemService(上下的常量)对应的sp对象;
利用sp对象的实力对象调取Edit()方法来获取对应的Editor对象;
通过Editor对象来进行Key-Value的键值对的数据存储;
最后再进行提交数据的处理(比如说commit、以及apply()等)
--二者有什么本质上的区别?相同点?---相同点:1、都是通过调用以上的两个api进行修改和提交数据;
2、二者都是原子过程;
不同点:1、apply没有返回值,而commit返回布尔值来判断是否提交成功;
2、apply是将修改后的数据原子提交给内存,而后异步真正提交给硬件磁盘;而commit是同步的提交给硬件磁盘,因此,在高并发的数据存取过
程中相比commit来说apply更加有效率,
3、apply失败后没有任何的提示;(什么是原子操作?--原子操作就是如果该原子数据开始处理时是不能被切换、暂停、覆盖的数据操作,不需要同步的数据处理操作,一旦开始就只能等着他结束,不受其他线程的影响)
16、对于继承自AppCompatActivity的子类Activity时 需要去掉默认的标题栏的api需要在setContentview方法的下面进行添加一句 getSupportActionBar().hide();
17、出现莫名的软件运行崩溃的时候(就是说没有在日志面板出现任何的异常公告和打印警告等)不妨尝试下try{ }catch(exception e){打印一下异常日志内容的详情检测 }
18、打包签名时一定要记住签名文件、别名、签名文件密码以及别名密码!
19、checkBox控件判断其是否选中的api是checkbox.isChecked();
20、添加第三方注入或者依赖的时候如果报错优先检查build.gradle文件里的classpath路径是否和你当前项目路径一致(或者是你本地gradle内包含该依赖库的版本没),其次就是检查最低版本号(minversion和margetVersion minSDK等属性是否一致)
21、Retrofit+Rxjava框架的有效使用:一、22个注解网络请求类,内部
22、Rxjava ——1、它是什么?--该框架是一个在java VM上 使用可观测的序列组成异步的、基于事件的程序库;(核心词汇是“异步”)
2、它有什么优点和好处呢?--一个词概括:简洁易用;
2017/8/16
——
怎么样禁止app横竖屏切换?
答:禁用app横竖屏切换的方式有两种:
1、在清单文件中配置对应的页面里设置禁止横屏如下:
<activity
android:name="chengyujia.androidtest.OrientationActivity"
android:screenOrientation="portrait" />
- 在代码中添加以下代码来实现动态禁止横屏的需求:
只要在onCreate方法中加一句
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
即可始终保持竖屏,如果要横屏,代码是
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
(
备注:如果是多个页面需要禁止切屏的设置那么建议抽取一个base类统一设置
)
———————————————————————————————————————
——
listview.onItemLongClick的调用后还会调用onItemClick吗?
答:这个要根据onItemLongClick的返回值来决定。
如果返回false那么onItemClick仍然会被调用。而且是先调用onItemLongClick,然后调用onItemClick。 (如果为false,会出现一个bug就是在用户长按条目时弹出相应提示的同时就会弹出应用程序打开方式的选择对话框,如果true的话那么就不会出现弹出对话框的情况)
如果返回true那么click就会被吃掉,onItemClick就不会再被调用了。
lv.setOnItemClickListener(new OnItemLongClickListener() {
public boolean onItemClick(AdapterView<?> parent, View view, int position, long id) {
System.out.println("Item LONG clicked. Position:" + position);
return false;
}
});
lv.setOnItemLongClickListener(new OnItemLongClickListener() {
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
System.out.println("Item LONG clicked. Position:" + position);
return false/true;
}
});
—————————————————————————————————————————
2017/8/16
——对于三星Galax Note3手机在app内通过代码调取相机拍照之后图片保存时app停止运行的问题?
答:三星note3上调用拍照时,发现调用相机拍完照片返回时,导致系统崩溃或者无 法获取到图片,仔细研究发现,拍完照后触发它的activity重新走了onCreate()方法。
解决方法:
1、刚开始调用了onSaveInstanceState(Bundle savedInstanceState)和onRestoreInstanceState(Bundle savedInstanceState)这个方法来实现,虽然方法比较笨,但是可以通过在onSaveInstanceState中保存一些你需要的变量,在onCreate()方法中判断savedInstanceState是否为null,不为null则调用onRestoreInstanceState()方法取出之前存的变量来使用,这相当于重新加载了一遍当前activity。
2、上面的方法并不是解决问题的根本办法,后来通过查看发现在调用相机时,activity从竖屏切换到了横屏,在横竖屏切换导致了activity重新装载,找到根本原因后,在activity中通过
Android
:configChanges=
”
orientation|keyboardHidden|keyboard|screenSize
”
这个属性,可以约束调用相机时,保持当前activity竖屏状态不变,从而解决了activity重新加载的问题,在manifest文件中配置。