首页 文章 精选 留言 我的

精选列表

搜索[android things],共10000篇文章
优秀的个人博客,低调大师

我要做 Android 之面笔试

二:如何进制转换 二进制 → 十进制 方法:二进制数从低位到高位(即从右往左)计算,第0位的权值是2的0次方,第1位的权值是2的1次方,第2位的权值是2的2次方,依次递增下去,把最后的结果相加的值就是十进制的值了。 例:将二进制的(101011)B转换为十进制的步骤如下: \1. 第0位 1 x 2^0 = 1; \2. 第1位 1 x 2^1 = 2; \3. 第2位 0 x 2^2 = 0; \4. 第3位 1 x 2^3 = 8; \5. 第4位 0 x 2^4 = 0; \6. 第5位 1 x 2^5 = 32; \7. 读数,把结果值相加,1+2+0+8+0+32=43,即(101011)B=(43)D。 八进制 → 十进制 方法:八进制数从低位到高位(即从右往左)计算,第0位的权值是8的0次方,第1位的权值是8的1次方,第2位的权值是8的2次方,依次递增下去,把最后的结果相加的值就是十进制的值了。 八进制就是逢8进1,八进制数采用 0~7这八数来表达一个数。 例:将八进制的(53)O转换为十进制的步骤如下: \1. 第0位 3 x 8^0 = 3; \2. 第1位 5 x 8^1 = 40; \3. 读数,把结果值相加,3+40= (二) (十进制) → (二、八、十六进制) 04.png (Figure3:十进制转换为其它进制) 十进制 → 二进制 方法:除2取余法,即每次将整数部分除以2,余数为该位权上的数,而商继续除以2,余数又为上一个位权上的数,这个步骤一直持续下去,直到商为0为止,最后读数时候,从最后一个余数读起,一直到最前面的一个余数。 例:将十进制的(43)D转换为二进制的步骤如下: \1. 将商43除以2,商21余数为1; \2. 将商21除以2,商10余数为1; \3. 将商10除以2,商5余数为0; \4. 将商5除以2,商2余数为1; \5. 将商2除以2,商1余数为0; \6. 将商1除以2,商0余数为1; \7. 读数,因为最后一位是经过多次除以2才得到的,因此它是最高位,读数字从最后的余数向前读,101011,即(43)D=(101011)B。 05.png (Figure4:图解十进制 → 二进制) 十进制 → 八进制 方法1:除8取余法,即每次将整数部分除以8,余数为该位权上的数,而商继续除以8,余数又为上一个位权上的数,这个步骤一直持续下去,直到商为0为止,最后读数时候,从最后一个余数起,一直到最前面的一个余数。 例:将十进制的(796)D转换为八进制的步骤如下: \1. 将商796除以8,商99余数为4; \2. 将商99除以8,商12余数为3; \3. 将商12除以8,商1余数为4; \4. 将商1除以8,商0余数为1; \5. 读数,因为最后一位是经过多次除以8才得到的,因此它是最高位,读数字从最后的余数向前读,1434,即(796)D=(1434)O。 06.png 43,即(53)O=(43)D。 算法实现: public static void toBin(int num){ StringBuffer sb = new StringBuffer(); while(num>0){ sb.append(num%2); num = num / 2; } System.out.ptintln(sb.reverse()); } 三:如何正确结束 Java 线程 使用标志位 很简单地设置一个标志位,名称就叫做 isCancelled。启动线程后,定期检查这个标志位。如果 isCancelled = true,那么线程就马上结束。 public class MyThread implements Runnable { private volatile boolean isCancelled; public void run() { while(!isCancelled){ //do something } } public void cancel() { isCancelled=true; } } 注意的是,isCancelled 需要为 volatile,保证线程读取时 isCancelled 是最新数据。 我以前经常用这种简单方法,在大多时候也很有效,但并不完善。考虑下,如果线程执行的方法被阻塞,那么如何执行isCancelled的检查呢?线程有可能永远不会去检查标志位,也就卡住了。 使用中断 Java提供了中断机制,Thread类下有三个重要方法。 public void interrupt() public boolean isInterrupted() public static boolean interrupted(); // 清除中断标志,并返回原状态 每个线程都有个boolean类型的中断状态。当使用Thread的interrupt()方法时,线程的中断状态会被设置为true。 下面的例子启动了一个线程,循环执行打印一些信息。使用isInterrupted()方法判断线程是否被中断,如果是就结束线程。 public class InterruptedExample { public static void main(String[] args) throws Exception { InterruptedExample interruptedExample = new InterruptedExample(); interruptedExample.start(); } public void start() { MyThread myThread = new MyThread(); myThread.start(); try { Thread.sleep(3000); myThread.cancel(); } catch (InterruptedException e) { e.printStackTrace(); } } private class MyThread extends Thread { @Override public void run() { while (!Thread.currentThread().isInterrupted()) { try { System.out.println("test"); Thread.sleep(1000); } catch (InterruptedException e) { System.out.println("interrupt"); //抛出InterruptedException后中断标志被清除,标准做法是再次调用interrupt恢复中断 Thread.currentThread().interrupt(); } } System.out.println("stop"); } public void cancel() { interrupt(); } } } 对线程调用interrupt()方法,不会真正中断正在运行的线程,只是发出一个请求,由线程在合适时候结束自己。 例如 Thread.sleep 这个阻塞方法,接收到中断请求,会抛出 InterruptedException,让上层代码处理。这个时候,你可以什么都不做,但等于吞掉了中断。因为抛出 InterruptedException 后,中断标记会被重新设置为false!看 sleep() 的注释,也强调了这点。 记得这个规则:什么时候都不应该吞掉中断!每个线程都应该有合适的方法响应中断! 所以在InterruptedExample例子里,在接收到中断请求时,标准做法是执行Thread.currentThread().interrupt()恢复中断,让线程退出。 从另一方面谈起,你不能吞掉中断,也不能中断你不熟悉的线程。如果线程没有响应中断的方法,你无论调用多少次interrupt()方法,也像泥牛入海。

优秀的个人博客,低调大师

我要做 Android 之 Activity

1 说下 Activity 的生命周期 为了巩固所学知识点,为自己找工作做准备,一是为了能分享给更多的人,所以从已经拿了6家 offer 的小姐姐 https://www.jianshu.com/u/203b606b956c 博客里抓来了这些面试题目赶紧复(预)习一下。 首先说下 Activity 生命周期的回掉方法 ·//创建Activity public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } //Activity快要变成可见的 @Override protected void onStart() { super.onStart(); } //Activity变成可见的,处于运行状态 @Override protected void onResume() { super.onResume(); } //其他Activity获得用户焦点,(Activity快要暂停了) @Override protected void onPause() { super.onPause(); } //Activity不再可见,处于停止状态 @Override protected void onStop() { super.onStop(); } //Activity快要被销毁了 @Override protected void onDestroy() { super.onDestroy(); } 相信很多小伙伴对这些方法都比较熟悉,只是如果问的再详细一点呢?更详细一点呢?你还会比较熟悉吗?我的答案是不熟悉,相信很多小伙伴都有感觉,忘记的时候直接去查不就好了,但是面试官可不管啊童鞋们。面试大佬们一看这都不会,回去等通知吧。。。 这里我们可以看到 Activity 生命周期中的三个嵌套循环:(什么,三个,我怎么只看到一个,,,) 一:Activity 的 全部生命周期 发生在调用 onCreate() 和 调用 onDestory() 之间。在 onCreate() 方法中执行全局状态的建立(例如定义布局),在 onDestroy() 方法中释放所有保存的资源。 二:Activity 的 可见生命周期 发生在调用 onStart() 和 onStop() 之间。在这个期间,用户能在屏幕上看见 Activity,和它进行交互。系统在 Activity 的完整寿命中可能多次调用 onStart() 和 onStop(), 正如 Activity 交替地对用户可见或隐藏。 三:Activity 的 前台生命期 发生在调用 onResume() 和 onPause() 之间。在这期间,Activity 在屏幕上所有其他 Activity 的前面,有用户输入焦点。一个 Activity 能频繁的在前台进入和出去之间转变。 看下图(其实估计很多同学都看过,看烂了,没办法,图片虐我千百遍,我待图片如初恋) andr01.png 我们书写两个 Activity,只有简单的显示功能 public class MainActivity extends AppCompatActivity { private Button btn_Second; private static final String TAG = "ActivityTest"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d(TAG, "MainActivity onCreate"); btn_Second = findViewById(R.id.btn_second); btn_Second.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); startActivity(intent); } }); } @Override protected void onStart() { Log.d(TAG, "MainActivity onStart"); super.onStart(); } @Override protected void onResume() { Log.d(TAG, "MainActivity onResume"); super.onResume(); } @Override protected void onPause() { Log.d(TAG, "MainActivity onPause"); super.onPause(); } @Override protected void onStop() { Log.d(TAG, "MainActivity onStop"); super.onStop(); } @Override protected void onDestroy() { Log.d(TAG, "MainActivity onDestroy"); super.onDestroy(); } } SecondActivity public class SecondActivity extends AppCompatActivity { private static final String TAG = "SecondActivity"; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); Log.d(TAG, "SecondActivity onCreate"); } @Override protected void onStart() { Log.d(TAG, "MainActivity onStart"); super.onStart(); } @Override protected void onResume() { Log.d(TAG, "MainActivity onResume"); super.onResume(); } @Override protected void onPause() { Log.d(TAG, "MainActivity onPause"); super.onPause(); } @Override protected void onStop() { Log.d(TAG, "MainActivity onStop"); super.onStop(); } @Override protected void onDestroy() { Log.d(TAG, "MainActivity onDestroy"); super.onDestroy(); } } 1 运行后的打印结果 andr02.png 点击按钮之后的截图 andr03.png 大家可以看到,生命周期的执行顺序,首先调用 MainActivity 的 pause 方法,之后是 SecondActivity 的正常创建显示,和上一个图顺序相同。等 SecondActivity 完全显示之后,会调用 MainActivity 的 stop 方法,表示该 Activity 停止活动。 ps:这是正常的活动跳转调用。 那如果不正常呢? 2 比如点击弹出的不是一个 Activity,二是一个 dialog。把 theme 改成这样: andr06.png 运行结果是这样: andr04.png 可以发现此时 MainActivity 完全可见,所以此时的执行周期是怎样的呢? andr05.png 点击跳转之后只是执行了 MainActivity 方法,而没有执行 onStop 方法。记住,划重点啊朋友们。 3 若将SecondActivity改为不是Dialog,把上图中的 theme 这一行删掉即可。再点击跳转按钮: 依次调用了它的回调方法: onPause()->onStop() 4 当 Activity 处于运行状态的时候点击返回按钮, andr07.png 点击返回按钮,Activity由运行状态变为死亡状态,依次调用它的回调方法:onPause() -> onStop() -> onDestroy() 5 当 Activity 处于运行状态的时候,点击 home 键直接返回桌面 andr08.png Activity由运行状态变为停止状态,依次调用它的回调方法:onPause()->onStop() 6:Activity处于运行状态,旋转屏幕: andr09.png 可以看出,旋转屏幕是一个销毁Activity然后重新创建Activity的过程。运行->暂停->停止->死亡->运行依次调用回调方法: onPause() -> onStop -> onDestroy() -> onCreate() -> onStart() -> onResume() Activity处于运行状态,手机此时锁屏。 手机锁屏,此时由于Activity不可见,会进入停止状态。依次调用回调方法:onPause()->onStop() 8.当应用正在运行时,手机锁屏,然后解锁回到应用界面。应用从停止状态恢复到运行状态。依次调用回调方法:onRestart() -> onStart() -> onResume();注意此时是 onRestart 方法 看看我们这篇文章解决了几个问题? Q:说下Activity的生命周期? Q:onStart()和onResume()/onPause()和onStop()的区别? Q:Activity A启动另一个Activity B会回调哪些方法?如果Activity B是完全透明呢?如果启动的是一个Dialog呢? Activity1启动的时候 Activity1(onCreate)--->Activity1(onStart)--->Activity1(onResume) Activity1跳转到Activity2的时候(2完全覆盖了1) Activity1 (onPause)---> Activity1(onStop) Activity2(onCreate)--->Activity2(onStart)--->Activity2(onResume) 特殊: 如果2是透明的窗体或者对话框样式的主题,那么1就不会调用onStop方法; 如果1已经存在该Activity的栈中,则不会调用onCreate方法。 呐,我在最后列出了问题,也给出了总结和补充,欢迎小伙伴们留言。 愿我们成为真实的自己。

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册