新买了一个笔记本电脑,同步win10的时候,凭据自动同步了git库.下拉公司代码的时候,命令行死活都是报错,也不弹出提示框。
1.小娜搜索凭据管理器 去里面普通凭据git库几个删除了。如果无效采用step2
2.git config --system --unset credential.helper (记住一定开启管理员权限的cmd或者powershell)

重新拉代码输入吧

给定一个数组,给定一个目标数,得到数组中两个相加等于目标数的下标

解:

private int[] test(int[] nums,int target) {
        int[] result = new int[2];
        for (int i = 0; i < nums.length - 1; i++) {
            for (int j = i+1; j < nums.length; j++) {
                if (nums[i] + nums[j] == target) {
                    result[0] = i;
                    result[1] = j;
                }


            }
        }
        return result;
    }

这道题一开始还愣了下。发现人家推荐直接暴力解,好吧,那就暴力解吧,自己一开始写的考虑边界的时候,考虑不周,如果需要遍历不是很好,通过i,j互相限制,保证数组不越界。

leetcode

最近事情颇多,忙不过来的赶脚,加上暑假终于过去,开始努力起来了。

哎,最近被大佬问了一个关于Handler的问题,支支吾吾了半天,发现自己又是没有深入了解,乘着有动力,抓紧复习一波。
handler是Android方面的消息机制。

对于开发者来说(比如我),刚学习Android的时候,总是会遇到非UI线程无法操作view的情况。往往遇到这种时候,就需要用到handler去处理更新view。但其实handler的用途远远不止这些。

消息机制的四个点:Handler(处理者)、Message(消息体)、MessageQueue(消息队列)和Looper(一个循环的泵)。

  1. Handler 如何跨进程传递消息的呢
    比如当前有两个线程:A代表主线程,B代表子线程。B执行一个耗时任务,结束了将结果返回给A。这个过程是如何实现的呢?
private Handler mHandler = new Handler(){
       @Override
       public void handleMessage(Message msg) {
           switch (msg.what){
               case 1:
                   break;
               default:
                   break;
           }
           super.handleMessage(msg);
       }
   };
 new Thread(new Runnable() {
            @Override
            public void run() {
                //very 耗时的操作
                //····
                //···
                //··
                Message msg = mHandler.obtainMessage();
                msg.what = 1;
                msg.obj = "result";
                mHandler.sendMessage(msg);

            }
        }).start();

当创建一个Handler对象的时候,在activity中直接new Handler()创建的handler对象默认最终走到

  public Handler(Callback callback, boolean async) {
        if (FIND_POTENTIAL_LEAKS) {
            final Class<? extends Handler> klass = getClass();
            if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) &&
                    (klass.getModifiers() & Modifier.STATIC) == 0) {
                Log.w(TAG, "The following Handler class should be static or leaks might occur: " +
                    klass.getCanonicalName());
            }
        }

        mLooper = Looper.myLooper();
        if (mLooper == null) {
            throw new RuntimeException(
                "Can't create handler inside thread that has not called Looper.prepare()");
        }
        mQueue = mLooper.mQueue;
        mCallback = callback;
        mAsynchronous = async;
    }

可以看到Looper.myLooper();方法创建一个looper对象,这个looper对象查看方法可知

 public static @Nullable Looper myLooper() {
        return sThreadLocal.get();
    }

是通过ThreadLocal获取的,ThreadLoacl是什么呢?你可以理解成一个根据当前线程的容器,可以存储任何数据。但是这些数据存储提取的前提是,只在当前线程,别的线程可以吗?不行。

所以这里的sThreadLocal.get();是从哪里获取的呢?这里牵扯到主线程(UI)的问题。当一个activity创建的时候,ActivityThread默认会调用Looper.prepareMainLooper();和Looper.loop();方法,这两个方法默认已经将主线程的Looper和MessageQueue已经搭好了,并且保存在主线程的ThreadLocal中去了。(ThreadLocal具体可以看Android开发艺术探索,或者以后我填坑

心血来潮,复习一波架构
mvc定义
m层:model 业务逻辑处理
v层:view 处理数据显示的部分
c层:control activity处理用户交互问题
特点:耦合性低,可扩展性好(这两相辅相成),模块职责划分清晰

类似activity中控制model层去下载东西,最后通过接口回调给activity,activity再去通知view层展示下载完成的样式。


mvp定义
因为在Android中view层大部分是layout下的xml文件,能力非常有限,所以activity承担了大部分控制view的功能,导致activity会非常的冗余,所以引出mvp架构
m层:model 还是业务逻辑和实体模型
v层:activity 对应activity,负责view的绘制和用户交互(谷歌推荐的todo-mvp是通过加一个fragment,将fragment当成view,更加直观和理解)
p层:presenter 负责view和model的交互

特点:耦合性更加低,因为mvc中,view层是可以和model层进行联系的,而在mvp中,view和model是无法直接联系的,为什么说这个很好呢,因为在Android中,view的操作全部需要在UI线程(主线程),如果数据操作和视图操作全部分离的话,通过桥梁presenter进行通信,更加符合Android实际开发。

为啥不说mvvm呢?因为那个貌似是前端用的比较多。而且一般看,貌似跟dragger2联系比较多,那个框架我不是很熟,等待我学习后,再补充吧。
话说,七牛云的插件有点问题,我每次发图,得先保存七牛云再链接到blog,有点复杂。