0%

目前大多数使用协程进行网络请求都需要依赖ViewModel和LiveData,但是这样会引入新的ViewModel类,使用起来总是不够简便,能不能像普通的网络请求一样直接进行接口请求,数据处理呢?答案肯定是可行的。

首先需要添加依赖

1
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.2.0'

由于本文是基于Coroutines+retrofit+okhttp等框架进行网络请求的,网络相关的依赖如下

1
2
implementation 'com.squareup.okhttp3:okhttp:4.2.1'
implementation 'com.squareup.retrofit2:retrofit:2.6.2'

需要注意的是retrofit的版本需要2.6.0以上,不然使用方式会不一样

阅读全文 »

在Android开发中使用渐变图十分常见,使用最多的就是在xml中创建渐变图,其次就是使用GradientDrawable在代码中编码实现,
使用代码创建GradientDrawable代码如下(以kotlin为例)

1
view.background = GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM,intArrayOf(Color.RED,Color.LTGRAY))

但是需要注意的是代码中设置使用默认的两参数构造函数渐变方向会出现未生效的问题,无论怎么更改构造函数中的Orientation,渐变的方向都是从左到右,解决办法就是不使用带有方向的构造函数方法,而使用无参构造函数生成GradientDrawable后再进行设置相关属性,代码如下:

1
2
3
4
5
view.background = GradientDrawable().apply {
colors = intArrayOf(Color.RED,Color.LTGRAY)
shape = GradientDrawable.RECTANGLE
orientation = GradientDrawable.Orientation.TOP_BOTTOM
}

引言

最近项目变更的比较频繁,跨平台开发也提上了议程,我也在考虑是不是需要引入一些动态化比较成熟的方案,目前就RN,Weex这两家有比较成熟的方案,RN社区很成熟,但上手门槛太高,Weex恰好相反,由于团队都是用的Vue,最后选择了Weex,下面是一些入坑指南。

开发环境搭建

这个网上一搜一大堆,这里就不贴了,随便附上官网链接:

http://weex.apache.org/cn/guide/

需要注意的是在使用npm安卓Weex时如果使用最新版本的npm有可能会包下面的错误

1
npm Error: write after end

这里把npm降级成5.6.0版本就可以了

1
npm install npm@5.6.0
阅读全文 »

引言

最近项目在用百度地图SDK进行开发,在添加覆盖物的时候遇到了一些坑,在此记录下。

添加Marker

添加Marker有两种方式,一种是通过BaiduMap的addOverlays()方法添加,另一种是通过OverlayManager的addToMap()添加,实际上内部实现都是一样的,只是API不同

  • 通过BaiduMap.addOverlays()方法添加覆盖物
    1
    2
    3
    OverlayOptions option = new MarkerOptions();
    option.position(latLng).icon(unselectedBitmap).title(cardStatistics.getCusName()).extraInfo(bundle);
    baiduMap.addOverlays(overlayOptions);
  • 通过OverlayManager的addToMap()方法添加覆盖物
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    OverlayManager overlayManager = new OverlayManager(mapView.getMap()) {
    @Override
    public List<OverlayOptions> getOverlayOptions() {
    return overlayOptions;
    }

    @Override
    public boolean onMarkerClick(Marker marker) {
    onMarkerClick(marker);
    return false;
    }

    @Override
    public boolean onPolylineClick(Polyline polyline) {
    return false;
    }
    };
    overlayManager.addToMap();
阅读全文 »

引言

ConstraintLayout是Android Studio 2.2中主要的新增功能之一,也是Google在去年的I/O大会上重点宣传的一个功能。
ConstraintLayout最显著的优点就是它可以有效地解决布局嵌套过多的问题。我们平时编写界面,复杂的布局总会伴随着多层的嵌套,而嵌套越多,程序的性能也就越差。ConstraintLayout则是使用约束的方式来指定各个控件的位置和关系的,它有点类似于RelativeLayout,但远比RelativeLayout要更强大。

添加依赖

我们需要在app/build.gradle文件中添加ConstraintLayout的依赖

Android Studio 3.0以下

compile ‘com.android.support.constraint:constraint-layout:1.0.2’

Android Studio3.0以上

implementation ‘com.android.support.constraint:constraint-layout:1.0.2’

Android Studio 3.0增加了许多新特性,依赖关键字的变化是其中之一,使用implementation是新版本Android Studio默认的依赖关键字,它可以隐藏依赖的内部细节,加快编译速度。

示例

首先来看一个例子:
item_list
要实现上图所示的效果你一定在想这很简单啊,刷刷的就写出来了,然后发现嵌套了三四层,要是再放到列表里面你会发现页面滑动时很不流畅,这时就轮到ConstraintLayout出场了,先贴代码

阅读全文 »

引言

Android Studio从3.0版本新增了许多功能,当然首当其冲就是从3.0版本新增了对 Kotlin 开发语言的支持,除此之外还有其他一些新功能,例如:Android Profiler (其中包含了: CPU Profiler、Memory Profiler、Network Profiler ),APK Debugger,Device File Explorer,Java 8 Language Features等详情

当然作为一个程序员,我们应该积极拥抱变化,不能说好麻烦,又不是不能用之类的话,不然又和咸鱼有什么区别呢。

升级方式

1.应用内升级
在Android Studio内使用快捷键citr+alt+s打开设置界面,搜索updates点击Check Now按钮即可收到升级推送
应用内升级
2.通过官网下载完整安装包安装
官网地址:https://developer.android.google.cn/studio/index.html

阅读全文 »

引言

在安卓中,有许多关于如何使用RecyclerView实现“drag & drop”与swipe-to-dismiss”的教程,库和例子。即使现在已经有了新的,更优的实现方式,大多数仍然是使用老旧的View.OnDragListener以及Roman Nurik在SwipeToDismiss中所使用的方法。很少有人使用新的api,反而要么经常依赖于GestureDetectors和onInterceptTouchEvent,要么实现方式很复杂。实际上,在RecyclerView上添加拖动特性有一个非常简单的方法。这个方法只需要一个类,并且它也是Android 兼容包的一部分,它就是:ItemTouchHelper

ItemTouchHelper是一个强大的工具,它处理好了关于在RecyclerView上添加拖动排序与滑动删除的所有事情。它是RecyclerView.ItemDecoration的子类,也就是说它可以轻易的添加到几乎所有的LayoutManager和Adapter中。它还可以和现有的item动画一起工作,提供受类型限制的拖放动画等等.

使用 ItemTouchHelper 和 ItemTouchHelper.Callback

要使用ItemTouchHelper,你需要创建一个ItemTouchHelper.Callback。这个接口可以让你监听“move”与 “swipe”事件。这里还是控制view被选中的状态以及重写默认动画的地方。如果你只是想要一个基本的实现,有一个帮助类可以使用:SimpleCallback,但是为了了解其工作机制,我们还是自己实现。

启用基本的拖动排序与滑动删除需要重写的主要回调方法是:

1
2
3
getMovementFlags(RecyclerView, ViewHolder)
onMove(RecyclerView, ViewHolder, ViewHolder)
onSwiped(ViewHolder, int)

两个帮助方法

1
2
isLongPressDragEnabled()
isItemViewSwipeEnabled()
阅读全文 »

由于我们很容易习惯公式化的预置代码,有时我们会忽略很优雅的细节。LayoutInflater以及它在Fragment的onCreateView()中填充View的方式带给我的就是这样的感受。这个类用于将XML文件转换成相对应的ViewGroup和控件Widget。我尝试在Google官方文档与网络上其他讨论中寻找有关的说明,而后发现许多人不但不清楚LayoutInflater的inflate()方法的细节,而且甚至在误用它。

这里的困惑很大程度上是因为Google上有关attachToRoot(也就是inflate()方法第三个参数)的文档太模糊:

被填充的层是否应该附在root参数内部?如果是false,root参数只适用于为XML根元素View创建正确的LayoutParams的子类。

其实意思就是:如果attachToRoot是true的话,那第一个参数的layout文件就会被填充并附加在第二个参数所指定的ViewGroup内。方法返回结合后的View,根元素是第二个参数ViewGroup。如果是false的话,第一个参数所指定的layout文件会被填充并作为View返回。这个View的根元素就是layout文件的根元素。不管是true还是false,都需要ViewGroup的LayoutParams来正确的测量与放置layout文件所产生的View对象。

阅读全文 »

引言

在开发过程中经常会用到StartActivityForResult方法启动一个Activity,然后在onActivityResult()方法中可以接收到上个页面的回传值,但你有可能遇到过拿不到返回值的情况,那有可能是因为Activity的LaunchMode设置为了singleTask5.0之后,android的LaunchMode与StartActivityForResult的关系发生了一些改变。两个Activity,A和B,现在由A页面跳转到B页面,看一下LaunchMode与StartActivityForResult之间的关系:

阅读全文 »

1. ArrayList的clone方法源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* Returns a shallow copy of this <tt>ArrayList</tt> instance. (The
* elements themselves are not copied.)
*
* @return a clone of this <tt>ArrayList</tt> instance
*/
public Object clone() {
try {
ArrayList<?> v = (ArrayList<?>) super.clone();
v.elementData = Arrays.copyOf(elementData, size);
v.modCount = 0;
return v;
} catch (CloneNotSupportedException e) {
// this shouldn't happen, since we are Cloneable
throw new InternalError(e);
}
}

该方法返回一个Object对象,所以在使用此方法的时候要强制转换。
ArrayList的本质是维护了一个Object的数组,所以克隆也是通过数组的复制实现的,对象不会被克隆,属于浅克隆。

阅读全文 »