android 基础知识-多线程问题、fragment介绍

527 阅读3分钟

「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战

android studio下载安装

下载安装android studio时,在官网下载linux版本,解压,在~/下载/android-studio-ide-191.5977832-linux/android-udio/bin路径下执行./studio.sh命令。

出现Unable to access Android SDK add-on list问题

​ 直接点击退出,在后续下载sdk,直接点击next

下载过程出现Android SDK Platform-Tools, SDK Patch Applier v4 and 5 more SDK components were not installed问题

​ 点击退出,在创建项目时,继续下载sdk,完成。

创建完项目出现Failed to load module "canberra-gtk-module"问题 sudo apt-get install libcanberra-gtk-module

android studio 基础知识

一. 多线程编程问题:

 btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            Thread.sleep(5000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }).start();
            }
        });
问题:

1.不能在主线程以外操作UI,android中把耗时的操作都放到子线程里面,主线程又叫UI线程

blog.csdn.net/cf8833/arti…

(1)不要阻塞主线程(UI线程) (2)不要从主线程以外的线程更新UI(UI线程)

方法1:

可以使用Activity的runOnUiThread方法将对UI的操作发布到主线程。 从主线程调用时,runOnUiThread方法立即执行传递的操作,但是当从主线程以外调用时,它会将传递的操作发布到主线程的事件队列。

public void run() {
         try {
             Thread.sleep(5000);
         } catch (InterruptedException e) {
             e.printStackTrace();
         }
         tv.post(new Runnable() {
         @Override
         public void run() {
             Toast.makeText(getApplicationContext(), "FourActivity3 click button", Toast.LENGTH_SHORT).show();
             tv.setText("FourActivity3 click button");
          }
         });
 }
方法2:

最经典的方式,扩展性最好,使用最广泛的,就是Thread+Handler实现异步消息处理

//这个地方的handler最好封装 防止内存泄漏
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if (msg.what == 100) {
                String res = (String) msg.obj;
                tv.setText(res);
                Toast.makeText(getApplicationContext(), res, Toast.LENGTH_SHORT).show();
            }
        }
    };

Fragment

在Java中设置View的layout_weight

LinearLayout view = (LinearLayout) findViewById(R.id.right_layout);
        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
    0, LinearLayout.LayoutParams.MATCH_PARENT, 1);
        view.setLayoutParams(layoutParams);

LinearLayout.LayoutParams的三个参数为宽,高,weight

回退栈

  • addToBackStack(tag); 将Fragment添加到回退栈中

  • popBackStack(); 清除回退栈中栈顶的Fragment

  • popBackStack(String tag, int i );

    如果i=0,回退到该tag所对应的Fragment层

    如果i=FragmentManager.POP_BACK_STACK_INCLUSIVE,回退到该tag所对应的Fragment的上一层

  • popBackStackImmediate 立即清除回退栈中栈顶Fragment

  • getBackStackEntryCount(); 获取回退栈中Fragment的个数

  • getBackStackEntryAt(int index) 获取回退栈中该索引值下的Fragment

Fragment切换

RecyclerView与Touch监听冲突

解决方法:

使用dispatchTouchEvent()方法,进行事件分发。

  1. public boolean dispatchTouchEvent( MotionEvent event)

            用于进行事件的分发,如果事件能够传递给当前的View,那么此方法一定会被调用。返回结构受当前View的onTouchEvent和下级View的dispatchTouchEvent方法的影响,表示是否消耗当前事件。
    
  2. public boolean onIntercptTouchEvent( MotionEvent event )

            在上述方法内部调用,用来判断是否拦截某个事件,如果当前View拦截了某个事件,那么在同一个事件序列中,此方法不会被再次调用,返回结果是表示是否拦截当前事件。本方法不在View内部,在ViewGroup中的dispatchEvent被调用。
    
  3. public boolean onTouchEvent( MotionEvent event )

            在dispatchTouchEvent方法中调用,用来处理点击事件,返回结果表示是否消耗当前事件,如果不消耗,则在同一个事件序列中,当前View无法再次接收到事件,事件全部往下传递给子View去了。