牛客网做题5.29

(1)下面的代码运行后会出现什么问题

public classMainActivity extends Activity implements OnClickListener

{

   private Button mBtnLogin = (Button) findViewById(R.id.btn_login);

   private TextView mTextViewUser;

  

   @Override

   protected void onCreate(BundlesavedInstanceState)

   {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        mTextViewUser = (TextView) findViewById(R.id.textview_user);

        mBtnLogin.setOnClickListener(this);

        new Thread()

        {

            @Override

            public void run()

            {

                mTextViewUser.setText(10);

            }

        }.start();

   }

  

   @Override

   public void onClick(View v)

   {

        mTextViewUser.setText(20);

   }

}

解析:

代码实测:

1、首先会报错NullPointerException,就是privateButton mBtnLogin = (Button) findViewById(R.id.btn_login);这个位置,要先加载了layout后才能成功获取到相应的按钮组件对象;

2、修改NullPointerException错误后再运行,报错 Resources$NotFoundException,在mTextViewUser.setText(10);这个位置(原本以为会先检查onclick方法里的setText(),但实际是run()里的setText()),要改成字符串形式;

3、修改上面的错误后再运行,报错Resources$NotFoundException,这次就轮到mTextViewUser.setText(20);这个位置了;

4、修改上面的错误后再运行,没有报错,程序成功运行,点击按钮后TextView由10变为20,说好的不能在非UI线程里更新UI组件呢?翻看别人的博客后,终于找到答案了,其实非UI线程是可以刷新UI的,前提是它要拥有自己的ViewRoot,ViewRoot是在onResume()里addview()创建的,所以是在 onResume()检查是否为UI线程,一般在onCreate()中通过子线程可以更新UI,但官方不建议这样做,因为 Android UI操作并不是线程安全的。

PS:而且,可以试下在上面代码的run()中setText()前加一句Thread.sleep(2000),先让线程休眠个2到3秒,就会报错ViewRootImpl$CalledFromWrongThreadException,说明已经检查到在非UI线程里更新UI。

(2)在安卓中哪一些可以进行跨进程

四种方式:

1.访问其他应用程序的Activity

2.Content Provider 

3.广播(Broadcast) 

4.AIDL服务

(3)AOP与OOP的理解

AOP和OOP都是一套方法论,也可以说成设计模式、思维方式、理论规则等等。 
AOP不能替代OOP,OOP是obejct abstraction,而AOP是concern abstraction,前者主要是对对象的抽象,诸如抽象出某类业务对象的公用接口、报表业务对象的逻辑封装,更注重于某些共同对象共有行为的抽象,如报表模块中专门需要报表业务逻辑的封装,其他模块中需要其他的逻辑抽象 ,而AOP则是对分散在各个模块中的共同行为的抽象,即关注点抽象。一些系统级的问题或者思考起来总与业务无关又多处存在的功能,可使用AOP,如异常信息处理机制统一将自定义的异常信息写入响应流进而到前台展示、行为日志记录用户操作过的方法等,这些东西用OOP来做,就是一个良好的接口、各处调用,但有时候会发现太多模块调用的逻辑大都一致、并且与核心业务无大关系,可以独立开来,让处理核心业务的人专注于核心业务的处理,关注分离了,自然代码更独立、更易调试分析、更具好维护。 
核心业务还是要OOP来发挥作用,与AOP的侧重点不一样,前者有种纵向抽象的感觉,后者则是横向抽象的感觉, AOP只是OOP的补充,无替代关系。

(5)java concurrent包下的4个类

A、Semaphore:类,控制某个资源可被同时访问的个数;

B、ReentrantLock:类,具有与使用synchronized方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大;

C、 Future:接口,表示异步计算的结果;

D、 CountDownLatch: 类,可以用来在一个线程中等待多个线程完成任务的类。

(6)可以处理Unicode字符都是字符流有关的类

简单地说,字符流是字节流根据字节流所要求的编码集解析获得的

可以理解为字符流=字节流+编码集

所以和字符流有关的类都拥有操作编码集(unicode)的能力。

而后缀是Stream的都是字节流,其他的都是字符流。

字节流:

InputStream   
|-- FileInputStream (基本文件流)   
|-- BufferedInputStream   
|-- DataInputStream   

|-- ObjectInputStream

字符流

Reader 
|-- InputStreamReader (byte->char 桥梁) 
|-- BufferedReader (常用) 
Writer 
|-- OutputStreamWriter (char->byte 桥梁) 
|-- BufferedWriter 
|-- PrintWriter (常用)

猜你喜欢

转载自blog.csdn.net/weixin_41673515/article/details/90669748
今日推荐