LoongWind's Blog

龙行如风


  • 首页

  • 归档

  • Android

  • 标签

  • 关于

Android AndroidX的集成

发表于 2018-05-30 | 分类于 Android | 阅读次数:

Google 2018 IO大会推出了Android新的扩展库AndroidX,用于替换原来的Android扩展库,将原来的android.*替换成androidx.*:.

Old New
android.support.** androidx.@
android.databinding.** androidx.databinding.@
android.design.** com.google.android.material.@
android.support.test.** (in a future release) androidx.test.@
android.arch.** androidx.@
android.arch.persistence.room.** androidx.room.@
android.arch.persistence.** androidx.sqlite.@
阅读全文 »

Android Jetpack之Paging初探

发表于 2018-05-29 | 分类于 Android | 阅读次数:

Paging是Google 2018 IO大会最新发布的Jetpack中的一个组件,主要用于大数据的分页加载,这篇文章就来探索一下关于Paging的简单使用。

Paging介绍

Paging主要由三个部分组成:DataSource PageList PageListAdapter

DataSource

DataSource<Key, Value>从字面意思理解是一个数据源,其中key对应加载数据的条件信息,Value对应加载数据的实体类。
DataSource是一个抽象类,但是我们不能直接继承它实现它的子类。但是Paging库里提供了它的三个子类供我们继承用于不同场景的实现:

  • PageKeyedDataSource<Key, Value> :适用于目标数据根据页信息请求数据的场景,即Key 字段是页相关的信息。比如请求的数据的参数中包含类似next/previous页数的信息。
  • ItemKeyedDataSource<Key, Value> :适用于目标数据的加载依赖特定item的信息, 即Key字段包含的是Item中的信息,比如需要根据第N项的信息加载第N+1项的数据,传参中需要传入第N项的ID时,该场景多出现于论坛类应用评论信息的请求。
  • PositionalDataSource<T>:适用于目标数据总数固定,通过特定的位置加载数据,这里Key是Integer类型的位置信息,T即Value。 比如从数据库中的1200条开始加在20条数据。

PageList

PageList是一个List的子类,支持所有List的操作,除此之外它主要有五个成员:
mMainThreadExecutor: 一个主线程的Excutor, 用于将结果post到主线程。

mBackgroundThreadExecutor: 后台线程的Excutor.

BoundaryCallback:加载Datasource中的数据加载到边界时的回调.

Config: 配置PagedList从Datasource加载数据的方式, 其中包含以下属性:

  • pageSize:设置每页加载的数量
  • prefetchDistance:预加载的数量,默认为pagesize
  • initialLoadSizeHint:初始化数据时加载的数量,默认为pageSize*3
  • enablePlaceholders:当item为null是否使用PlaceHolder展示

PagedStorage<T>: 用于存储加载到的数据,它是真正的蓄水池所在,它包含一个ArrayList<List> 对象mPages,按页存储数据。

PagedList会从Datasource中加载数据,更准确的说是通过Datasource加载数据, 通过Config的配置,可以设置一次加载的数量以及预加载的数量。 除此之外,PagedList还可以向RecyclerView.Adapter发送更新的信号,驱动UI的刷新。

阅读全文 »

Android Jetpack Navigation初探

发表于 2018-05-25 | 分类于 Android | 阅读次数:

在刚刚结束的谷歌IO大会上,谷歌推出了Android Jetpack架构组件,里面包含了Navigation组件,这篇文章我们就来看看这个Navigation的使用。

1、安装Android Studio 3.2

目前最新版本是3.2 CANARY 15,前往https://androidstudio.googleblog.com/下载最新版本。

2、添加项目依赖

  • repositories添加google仓库 和classpath

    1
    2
    3
    4
    5
    6
    7
    8
    buildscript {
    repositories {
    google()
    }
    dependencies {
    classpath "android.arch.navigation:navigation-safe-args-gradle-plugin:1.0.0-alpha01"
    }
    }
  • 添加navigation库的依赖

    1
    2
    3
    4
    5
    6
    7
    8
    9
    dependencies {
    def nav_version = "1.0.0-alpha01"

    implementation "android.arch.navigation:navigation-fragment:$nav_version" // use -ktx for Kotlin
    implementation "android.arch.navigation:navigation-ui:$nav_version" // use -ktx for Kotlin

    // optional - Test helpers
    androidTestImplementation "android.arch.navigation:navigation-testing:$nav_version" // use -ktx for Kotlin
    }
阅读全文 »

Android Launcher3 隐藏应用图标和widget的显示

发表于 2018-04-05 | 分类于 Android | 阅读次数:

在做Launcher开发的时候,有时候需要隐藏应用图标的显示或者隐藏某些应用的widget显示,这个时候怎么办呢?

查看Launcher3的源码,发现其实源码里已经提供了相关的实现,发现有一个AppFilter的抽象类,看名字就知道这是一个app过滤器,看看这个接口的源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package com.codemx.launcher3;

import android.content.ComponentName;
import android.text.TextUtils;
import android.util.Log;

public abstract class AppFilter {

private static final boolean DBG = false;
private static final String TAG = "AppFilter";

public abstract boolean shouldShowApp(ComponentName app);

public static AppFilter loadByName(String className) {
if (TextUtils.isEmpty(className)) return null;
if (DBG) Log.d(TAG, "Loading AppFilter: " + className);
try {
Class<?> cls = Class.forName(className);
return (AppFilter) cls.newInstance();
} catch (ClassNotFoundException e) {
Log.e(TAG, "Bad AppFilter class", e);
return null;
} catch (InstantiationException e) {
Log.e(TAG, "Bad AppFilter class", e);
return null;
} catch (IllegalAccessException e) {
Log.e(TAG, "Bad AppFilter class", e);
return null;
} catch (ClassCastException e) {
Log.e(TAG, "Bad AppFilter class", e);
return null;
}
}

}

提供了一个shouldShowApp的抽象方法,顾名思义就是判断哪些应用需要显示,通过这个方法来过滤。另外还提供了一个loadByName的静态方法,看实现是根据className通过反射实例化一个AppFilter的实现。

阅读全文 »

Kotlin+Dagger2开发android应用需要注意的那些问题

发表于 2018-03-30 | 分类于 Android | 阅读次数:

Kotlin已经出来很久了,最近也开始用kotlin开发android应用了,但是在使用kotlin+dagger2开发android应用的时候遇到了一些问题,在这里记录一下,希望能帮到同样遇到这些问题的同学。

先看一下在java下一个简单的dagger2的例子。
1、在app的build.gradle里加入dagger2的库

1
2
compile 'com.google.dagger:dagger:2.15'
annotationProcessor 'com.google.dagger:dagger-compiler:2.15'

2、编写一个简单的AppModule和AppComponent

1
2
3
4
5
6
7
8
@Module
public class AppModule {

@Provides
public String provideHelloWorld(){
return "Hello World";
}
}
阅读全文 »

FileConverterFactory实现Retrofit下载文件直接返回File

发表于 2016-05-05 | 分类于 Android | 阅读次数:

  最近在研究Retrofit下载文件,之前也写了两篇关于Retrofit下载上传文件以及下载上传进度的监听的问题.Retrofit上传/下载文件 和 Retrofit上传/下载文件扩展实现进度的监听.使用之中发现还是不是很方便.于是在想能不能想GsonConverterFactory那样自定义一个FileConverterFactory在响应回调中直接返回File呢?

想到就做,于是写了一个FileConverterFactory继承于Converter.Factory,以及FileConverter继承于FileConverter.

阅读全文 »

Retrofit上传/下载文件扩展实现进度的监听

发表于 2016-04-29 | 分类于 Android | 阅读次数:

上一篇文章介绍了用Retrofit实现文件的上传与下载,但是我们发现没办法监听上传下载的进度,毕竟我们在做开发的时候经常是要显示上传或者下载的进度了.虽然Retrofit没有给我们提供现成的api来监听进度,但是Retrofit很灵活,它底层网络访问是用的okhttp实现的,当然我们也可以设置其他第三方网络请求库,因为Retrofit可以设置client,我们可以由此来扩展下载上传的进度监听.

本文使用okhttp作为client来做,其实说白了跟用okhttp做下载上传进度监听几乎一样,参考了这篇文章:Android OkHttp文件上传与下载的进度监听扩展

阅读全文 »

Retrofit上传/下载文件

发表于 2016-04-28 | 分类于 Android | 阅读次数:

Retrofit是Square公司开源的简化 HTTP 请求的库,这篇文章主要介绍用Retrofit实现文件的上传与下载的功能.

本文使用的是Retrofit 2.0.2版本

1.文件上传

api service接口:

1
2
3
4
5
public interface UpLoadService {
@Multipart
@POST("upload.php")
Call<ResponseBody> upload(@Part MultipartBody.Part file);
}

阅读全文 »

Android Library发布到jcenter

发表于 2016-04-27 | 分类于 其他 | 阅读次数:

Android Library发布到jcenter

Android开发的时候我们经常会写一些公共的library给其他项目调用,将library上传到jcenter就可以在gradle里很方便的引用.也方便其他人使用.

jcenter是一个托管在bintray.com的资源库.我们要把library放到jcenter上就需要在bintray.com上注册账号然后创建package.这一步我就不详说了网上有很多介绍也很简单,我主要介绍一下在Android studio里library的配置,旨在记录一下怕自己以后忘了.

阅读全文 »

RxBus升级篇

发表于 2016-04-26 | 分类于 Android | 阅读次数:

之前写了一篇用RxJava实现事件总线RxBus并实现同类型事件的区分用RxJava实现了事件总线RxBus,并实现了通过code进行相同事件类型的区分。但是发现使用起来还是不怎么方便,没有eventbus那样用起来方便。

阅读全文 »
12…4

LoongWind

龙行如风的个人博客

31 日志
2 分类
59 标签
© 2018 LoongWind
由 Hexo 强力驱动
|
主题 — NexT.Mist v5.1.4
| 浙ICP备18011288号