• Stars
    star
    146
  • Rank 252,769 (Top 5 %)
  • Language
    Java
  • License
    Apache License 2.0
  • Created about 3 years ago
  • Updated 8 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

一个拓展性极强的Android任务执行框架。可自由定义和组合任务来实现你想要的功能,尤其适用于处理复杂的业务流程,可灵活添加前置任务或者调整执行顺序。例如:应用的启动初始化流程。

XTask

api I Star

一个拓展性极强的Android任务执行框架。可自由定义和组合任务来实现你想要的功能,尤其适用于处理复杂的业务流程,可灵活添加前置任务或者调整执行顺序。例如:应用的启动初始化流程。

在使用前,请一定要仔细阅读使用说明文档,重要的事情说三遍!!!

在使用前,请一定要仔细阅读使用说明文档,重要的事情说三遍!!!

在使用前,请一定要仔细阅读使用说明文档,重要的事情说三遍!!!

关于我

公众号 掘金 知乎 CSDN 简书 思否 哔哩哔哩 今日头条
我的Android开源之旅 点我 点我 点我 点我 点我 点我 点我

X系列库快速集成

为了方便大家快速集成X系列框架库,我提供了一个空壳模版供大家参考使用: https://github.com/xuexiangjys/TemplateAppProject

除此之外,我还特别制作了几期X系列视频教程供大家学习参考.


特征

  • 支持6种线程类型方式执行任务。
  • 支持任务链中各任务的执行线程调度和控制。
  • 支持快捷任务创建,同时支持自定义任务。
  • 支持串行和并行等组任务。
  • 支持任务间数据共享。
  • 支持自由组合任务执行。
  • 支持任务链执行取消。
  • 支持取消所有任务链和指定名称的任务链。
  • 支持任务链调用顺序记录和查询。
  • 支持自定义任务执行的线程池。

组成结构

  • 任务链ITaskChainEngine:任务链执行引擎,负责统筹调度各任务步骤。

  • 任务步骤ITaskStep:负责具体任务逻辑处理。

  • 数据存储仓库IDataStore:存放数据的仓库,主要用于保存任务参数中的数据。

  • 任务参数ITaskParam:负责任务路径记录以及任务产生的参数管理。

  • 任务执行结果ITaskResult:存放任务最终执行的结果以及产生的数据。

  • 任务组IGroupTaskStep:负责统筹调度各子任务步骤。

点击查看框架UML设计图

日志一览

task_log.png

task_log2.png


集成指南

添加Gradle依赖

1.先在项目根目录的 build.gradlerepositories 添加:

allprojects {
     repositories {
        ...
        maven { url "https://jitpack.io" }
    }
}

2.然后在应用项目(一般是app)的 build.gradle 的 dependencies 添加:

dependencies {
  ...
  // XTask
  implementation 'com.github.xuexiangjys.XTask:xtask-core:1.0.2'
}

使用方法

XTask作为对外统一的API入口,所有常用的方法都能从中找到。

打开调试模式

当需要定位问题,需要进行调试时,可打开调试模式,这样便可开启框架的日志。

XTask.debug(true);

XTask的API介绍

方法名 描述
debug 设置是否打开调试
setLogger 自定义日志打印
setIsLogThreadName 设置是否打印任务执行所在的线程名,默认false
getTaskChain 获取任务链执行引擎
getTask 获取简化的任务
getTaskBuilder 获取简化任务的构建者
getConcurrentGroupTask 获取并行任务组
getSerialGroupTask 获取串行任务组
cancelTaskChain 取消指定任务链执行
cancelAllTaskChain 取消所有任务链执行
postToMain 执行任务到主线程
postToMainDelay 延迟执行任务到主线程
submit 执行普通异步任务
emergentSubmit 执行紧急异步任务
backgroundSubmit 执行后台异步任务
ioSubmit 执行io耗时的异步任务
groupSubmit 执行分组异步任务
schedule 执行延期任务
scheduleAtFixedRate 执行周期任务(固定间期)
scheduleWithFixedDelay 执行周期任务(固定延期)

如何执行一条任务链

下面是一整个完整的例子:

// 1.创建一条任务链(必须)
final TaskChainEngine engine = XTask.getTaskChain();
// 2.设置任务链的初始化参数(可选)
engine.setTaskParam(TaskParam.get("chainName", engine.getName()));
TaskParam taskParam = TaskParam.get("param1", 100)
        .put("param2", true);
// 3.创建多个任务,并向任务链中添加(必须)
XTaskStep taskStep = XTask.getTask(new TaskCommand() {
    @Override
    public void run() {
        ITaskParam param = getTaskParam();
        Log.e(TAG, getName() + "  start, param1:" + param.get("param1") + ", chainName:" + param.get("chainName"));
        param.put("param1", 200);
        param.put("param3", "this is param3!");
    }
}, taskParam);
engine.addTask(taskStep)
        .addTask(XTask.getTask(new TaskCommand() {
            @Override
            public void run() {
                ITaskParam param = getTaskParam();
                Log.e(TAG, getName() + "  start, param1:" + param.get("param1") + ", param3:" + param.get("param3"));
                param.put("param2", false);
            }
        }));
// 4.设置任务链执行回调(可选)
ICanceller canceller = engine.setTaskChainCallback(new TaskChainCallbackAdapter() {
    @Override
    public void onTaskChainCompleted(@NonNull ITaskChainEngine engine, @NonNull ITaskResult result) {
        Log.e(TAG, "task chain completed, thread:" + Thread.currentThread().getName());
        Map<String, Object> data = result.getDataStore().getData();
        for (Map.Entry<String, Object> entry : data.entrySet()) {
            Log.e(TAG, "key:" + entry.getKey() + ", value:" + entry.getValue());
        }
    }
// 5.任务链执行(必须)
}).start();

1.创建一条任务链.(必须)

TaskChainEngine engine = XTask.getTaskChain();

2.设置任务链的初始化参数.(可选)

engine.setTaskParam(TaskParam.get("chainName", engine.getName()));

3.创建多个任务,并向任务链中添加.(必须)

// 设置任务初始化参数
TaskParam taskParam = TaskParam.get("param1", 100)
        .put("param2", true);
XTaskStep taskStep = XTask.getTask(new TaskCommand() {
    @Override
    public void run() {
        // ...执行任务
    }
}, taskParam);
engine.addTask(taskStep)
        .addTask(XTask.getTask(new TaskCommand() {
            @Override
            public void run() {
                // ...执行任务
            }
        }));

【注意】对于任务执行完成,需要注意以下两点:

  • 如果任务执行成功,就调用notifyTaskSucceed,任务执行失败,就调用notifyTaskFailed。这里任务无论成功还是失败,只要执行完成都需要调用notifyTaskXXX通知任务链该任务完成,否则任务将无法正常执行。
  • TaskCommandSimpleTaskStep默认提供了自动通知执行结果的功能,但是AbstractTaskStep没有提供,需要手动通知。

4.设置任务链执行回调.(可选)

调用setTaskChainCallback设置任务链执行回调。

engine.setTaskChainCallback(new TaskChainCallbackAdapter() {

    @Override
    public boolean isCallBackOnMainThread() {
        // 回调是否返回主线程, 默认是true
        return false;
    }
    @Override
    public void onTaskChainStart(@NonNull ITaskChainEngine engine) {
        Log.e(TAG, "task chain start");
    }
    @Override
    public void onTaskChainCompleted(@NonNull ITaskChainEngine engine, @NonNull ITaskResult result) {
        Log.e(TAG, "task chain completed, thread:" + Thread.currentThread().getName());
    }
    @Override
    public void onTaskChainError(@NonNull ITaskChainEngine engine, @NonNull ITaskResult result) {
        Log.e(TAG, "task chain error");
    }
})

5.任务链执行.(必须)

调用start执行任务链。

ICanceller canceller = engine.start();

任务创建

创建任务有两种方式:

  • 通过XTask.getTask构建
  • 继承SimpleTaskStep/AbstractTaskStep实现任务的自定义

通过XTask创建

通过XTask.getTask, 传入对应的属性进行构建

属性名 描述 默认值
name 任务步骤名称 XTaskStep-N(N为自增数)
command 任务执行内容 /
threadType 线程执行类型 ThreadType.ASYNC
taskParam 任务参数 new TaskParam()
taskHandler 任务处理者 null
isAutoNotify 是否自动通知任务执行结果 true
XTaskStep taskStep = XTask.getTask(new TaskCommand() {
    @Override
    public void run() {
        // todo
    }
}, ThreadType.ASYNC, taskParam);

通过继承创建

通过继承SimpleTaskStep或者AbstractTaskStep实现具体功能。

public class StepATask extends SimpleTaskStep {

    @Override
    public void doTask() throws Exception {
        // todo
        // 不需要手动通知任务链任务完成
    }
}

public class StepBTask extends AbstractTaskStep {

    @Override
    public void doTask() throws Exception {
        // todo
        // 需手动通知任务链任务完成
        notifyTaskSucceed(TaskResult.succeed());
    }

    @Override
    public String getName() {
        return "StepATask";
    }
}

任务执行原则

每一个任务都是依托于任务链进行流程控制。任何任务都需要遵循以下原则:

  • 任何任务无论失败还是成功,都需要调用notifyTaskSucceed或者notifyTaskFailed去通知任务链任务的完成情况。TaskCommandSimpleTaskStep默认提供了自动通知执行结果的功能。
  • 一旦任务链中某个任务执行失败,整个链路都停止工作。
任务类型 任务执行说明
TaskCommand 自动通知执行结果。如需手动通知,只需设置isAutoNotify为false即可
SimpleTaskStep 自动通知执行结果。如需手动通知,只需重写isAutoNotify方法为false即可
AbstractTaskStep 需手动通知执行结果

TaskCommand手动通知执行结果

在通过XTask.getTask传入TaskCommand构建Task的时候,设置isAutoNotify为false即可手动通知执行结果。

final TaskChainEngine engine = XTask.getTaskChain();
for (int i = 0; i < 5; i++) {
    int finalI = i;
    engine.addTask(XTask.getTask(new TaskCommand() {
        @Override
        public void run() {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (finalI == 2) {
                notifyTaskFailed(404, "任务执行失败!");
            } else {
                notifyTaskSucceed(TaskResult.succeed());
            }
        }
    }, false)); // 设置手动通知执行结果
}
engine.start();

SimpleTaskStep手动通知执行结果

重写SimpleTaskStepisAutoNotify方法为false即可手动通知执行结果。

public class StepATask extends SimpleTaskStep {

    @Override
    public void doTask() throws Exception {
        // todo
        // 手动通知任务链任务完成
        notifyTaskSucceed();
    }

    @Override
    protected boolean isAutoNotify() {
        return false;
    }
}

参数传递

  • 任何TaskStep我们都可以通过getTaskParam获取任务参数和任务执行结果ITaskParam
  • 上一个TaskStep保存处理过的任务参数会自动带入到下一个TaskStep中去,因此最后一个TaskStep拥有之前所有任务的参数数据。
XTask.getTask(new TaskCommand() {
    @Override
    public void run() {
        ITaskParam param = getTaskParam();
        Log.e(TAG, getName() + "  start, param1:" + param.get("param1") + ", param3:" + param.get("param3"));
        param.put("param2", false);
    }
})

线程控制

设置任务的threadType类型,即可完成对任务运行线程的控制。目前支持6种线程处理方式。

类型 描述 线程池构成
MAIN 主线程(UI线程) /
ASYNC 异步线程(开子线程,普通线程池) 核心线程数和最大线程为CPU数,0s keepTime,LinkedBlockingQueue(128),线程优先级5
ASYNC_IO 异步线程(开子线程,io线程池) 核心线程数和最大线程为(2*CPU数+1),30s keepTime,LinkedBlockingQueue(128),线程优先级5
ASYNC_EMERGENT 异步线程(开子线程,紧急线程池) 核心线程数为2,最大线程为∞,60s keepTime,SynchronousQueue(不阻塞),线程优先级10
ASYNC_BACKGROUND 异步线程(开子线程,优先级较低线程池) 核心线程数和最大线程为2,0s keepTime,LinkedBlockingQueue(128),线程优先级1
SYNC 同步线程(直接执行) /
// 1.构造时传入线程
XTaskStep taskStep = XTask.getTask(new SimpleTaskCommand(1000), ThreadType.ASYNC_EMERGENT);
// 2.设置线程的方法
taskStep.setThreadType(ThreadType.ASYNC_IO);

任务组

目前共有串行任务组(SerialGroupTaskStep)和并行任务组(ConcurrentGroupTaskStep)

串行任务组

串行任务组是按顺序依次执行,和任务链的处理方式类似。使用XTask.getSerialGroupTask获取。

final TaskChainEngine engine = XTask.getTaskChain();
SerialGroupTaskStep group1 = XTask.getSerialGroupTask("group1");
for (int i = 0; i < 5; i++) {
    group1.addTask(XTask.getTask(new SimpleTaskCommand(500)));
}
SerialGroupTaskStep group2 = XTask.getSerialGroupTask("group2");
for (int i = 0; i < 5; i++) {
    group2.addTask(XTask.getTask(new SimpleTaskCommand(1000)));
}
ICanceller canceller = engine.addTask(group1)
        .addTask(group2)
        .setTaskChainCallback(new TaskChainCallbackAdapter() {
            @Override
            public void onTaskChainCompleted(@NonNull ITaskChainEngine engine, @NonNull ITaskResult result) {
                Log.e(TAG, "task chain completed, path:" + result.getPath());
            }
        })
        .start();
addCanceller(canceller);

并行任务组

并行任务组是组内所有任务同时执行,待所有任务都完成后才视为任务组完成。使用XTask.getConcurrentGroupTask获取。

final TaskChainEngine engine = XTask.getTaskChain();
ConcurrentGroupTaskStep group1 = XTask.getConcurrentGroupTask("group1");
for (int i = 0; i < 5; i++) {
    group1.addTask(XTask.getTask(new SimpleTaskCommand(100 * (i + 1))));
}
ConcurrentGroupTaskStep group2 = XTask.getConcurrentGroupTask("group2");
for (int i = 0; i < 5; i++) {
    group2.addTask(XTask.getTask(new SimpleTaskCommand(200 * (i + 1))));
}
ICanceller canceller = engine.addTask(group1)
        .addTask(group2)
        .setTaskChainCallback(new TaskChainCallbackAdapter() {
            @Override
            public void onTaskChainCompleted(@NonNull ITaskChainEngine engine, @NonNull ITaskResult result) {
                Log.e(TAG, "task chain completed, path:" + result.getPath());
            }
        })
        .start();
addCanceller(canceller);

任务链取消

通过调用ICancellercancel方法或者XTaskcancelTaskChain即可完成任务链的取消。

单个任务链取消

调用任务链TaskChainEnginestart方法之后,会返回一个任务取消者ICanceller,调用它的cancel方法即可完成任务取消。

ICanceller canceller = engine.start();
// 取消任务链的执行
canceller.cancel();

多个任务链取消

任务链在执行的时候,会默认加入到一个任务取消池,调用XTaskcancelTaskChain方法,传入多个任务链的名称或者ICanceller的名称,即可完成多个任务链的取消。

Set<String> pool = new HashSet<>();
ICanceller canceller1 = engine1.start();
ICanceller canceller2 = engine2.start();
// 使用ICanceller的名称
pool.add(canceller1.getName());
// 使用任务链的名称
pool.add(engine2.getName());
// 取消多个任务链的执行
XTask.cancelTaskChain(pool);

全部任务链取消

调用XTaskcancelAllTaskChain方法取消全部任务链的执行

XTask.cancelAllTaskChain();

如果觉得项目还不错,可以考虑打赏一波

你的打赏是我维护的动力,我将会列出所有打赏人员的清单在下方作为凭证,打赏前请留下打赏项目的备注!

pay.png

联系方式

更多资讯内容,欢迎扫描关注我的个人微信公众号:【我的Android开源之旅】

More Repositories

1

XUI

💍A simple and elegant Android native UI framework, free your hands! (一个简洁而优雅的Android原生UI框架,解放你的双手!)
Java
4,849
star
2

XUpdate

🚀A lightweight, high availability Android version update framework.(一个轻量级、高可用性的Android版本更新框架)
Java
2,309
star
3

flutter_template

The project of the empty template with Flutter has built the basic framework to realize the functions of internationalization, theme peeling, login and registration, etc.(Flutter空壳模板工程,已搭建基础框架,实现国际化、主题换肤、登录注册、自动路由注册等功能,可在此基础上简单修改实现自己的应用功能)
Dart
897
star
4

TemplateAppProject

Android template project, fast construction (integrated XUI, XUtil, XAOP, XPage, XUpdate, XHttp2, Umeng Statistics and Walle multi-channel package). Android空壳模板工程,快速搭建(集成了XUI、XUtil、XAOP、XPage、XUpdate、XHttp2、友盟统计和walle多渠道打包)
Java
838
star
5

XPush

🚀一个轻量级、可插拔的Android消息推送框架。一键集成推送(极光推送、友盟推送、信鸽推送、华为、小米推送等),提供有效的保活机制,支持推送的拓展,充分解耦推送和业务逻辑,解放你的双手!
Java
767
star
6

XAOP

🔥A lightweight AOP(Android) application framework. Includes the most practical AOP applications.(一个轻量级的AOP(Android)应用框架。囊括了最实用的AOP应用)
Java
733
star
7

XHttp2

💪A powerful network request library, encapsulated using the RxJava2 + Retrofit2 + OKHttp combination.(一个功能强悍的网络请求库,使用RxJava2 + Retrofit2 + OKHttp组合进行封装)
Java
403
star
8

XPage

🔥A very useful Fragment page framework!(一个非常方便实用的fragment页面框架!)
Java
393
star
9

flutter_xupdate

A Flutter plugin for XUpdate(Android Version Update Library)
Dart
290
star
10

XUtil

一个方便实用的Android工具类库
Java
224
star
11

XUpdateService

Use Spring Boot easy build, Gradle build, and provide update service for XUpdate.(使用Spring Boot简易搭建,Gradle构建,为XUpdate提供更新服务)
Java
217
star
12

FlutterSample

Flutter使用指南,包含众多组件和插件的使用
Dart
205
star
13

XQRCode

A very convenient and practical qrcode scanning, analysis, generation library.(一个非常方便实用的二维码扫描、解析、生成库)
Java
193
star
14

TemplateSimpleProject

简化版的Android空壳模板工程,快速搭建(集成了XUI、XUtil、XAOP、XPage、友盟统计和walle多渠道打包)
Java
131
star
15

xupdate-management

使用Vue.js编写的版本更新管理后台,为XUpdate提供版本更新管理
Vue
116
star
16

XVideo

一个能自动进行压缩的小视频录制库
C
102
star
17

XUpdateAPI

简化XUpdate的使用, 一键实现版本更新功能!
Java
92
star
18

RxUtil2

一个实用的RxJava2工具类库
Java
90
star
19

AndroidAdvancedLearning

Android进阶学习(源码分析、经验技术、感悟等)
71
star
20

XFloatView

一个简易的悬浮窗实现方案
Java
66
star
21

architect-java

成为架构师必须要看的算法实例
Java
56
star
22

TemplateAppProject-kotlin

Android空壳模板工程(kotlin版本),快速搭建(集成了XUI、XUtil、XAOP、XPage、XUpdate、XHttp2、友盟统计和walle多渠道打包)
Kotlin
56
star
23

XOrmlite

一个方便实用的OrmLite数据库框架,支持一键集成。
Java
55
star
24

react-native-xupdate

A React-Native plugin for XUpdate(Android Version Update Library)
Java
53
star
25

XHttpApi

一个简单的spring boot搭建的api服务,为XHttp提供服务支持。包括:常用的数据库数据增、删、改、查,文件上传下载,全局异常捕获、权限认证、日志记录等。
Java
50
star
26

TemplateAndServer

简化版的Android服务端模板,用于接口模拟测试。
Java
49
star
27

RxBus

一个简易的Android事件通知库,使用RxJava和Javassist设计,拒绝使用反射,保证性能高效稳定。
Java
43
star
28

Protobuf-gRPC-Android

教你如何使用ProtoBuf,通过gRPC服务在android上进行网络请求
Java
42
star
29

XRouter

一个轻量级的Android路由框架,基于ARouter上进行改良,优化Fragment的使用,可结合XPage使用。
Java
42
star
30

XLog

一个简易的日志打印框架(支持打印策略自定义,默认提供2种策略:logcat打印和磁盘打印)
Java
37
star
31

XIPC

一个Android通用的IPC(进程通信)框架。该项目主要是模仿饿了么开源项目Hermes的设计进行的自我理解改写。
Java
36
star
32

flutter_app_update_example

演示如何使用现有的flutter插件实现应用内的版本更新功能
Dart
33
star
33

flutter_update_dialog

Application version update dialog.
Dart
31
star
34

RxUtil

[DEPRECATED]囊括了最实用的RxJava工具类集合
Java
31
star
35

XMark

一个简易的埋点解决方案(基于JakeWharton的hugo基础上改造)
Java
29
star
36

RxJava3Sample

RxJava3使用演示, 包含简介、例子、日志和源码等内容。
Java
28
star
37

XTCP

一个便捷的TCP消息包拼装和解析框架
Java
24
star
38

TemplateSimpleProject-kotlin

简化版的Android空壳模版工程(kotlin版本),快速搭建(集成了XUI、XUtil、XAOP、XPage、友盟统计和walle多渠道打包)
Kotlin
22
star
39

TinkerTest

演示如何使用腾讯的热修复框架-Tinker
Java
21
star
40

MarqueeTextView

Android滚动字幕,支持动态添加和删除,支持消息数据的更新
Java
20
star
41

CloudBlindDate

云相亲,一种解决地域、时间、距离的快捷相亲方式。利用TemplateAppProject快速开发,半天完成主体功能。
Java
19
star
42

XPush-MQTT

MQTT在Android上的使用,目前已集成了XPush
Java
17
star
43

KotlinSample

Kotlin相关使用案例
Kotlin
15
star
44

AndroidPerformanceSample

Android性能优化实践
Java
14
star
45

AppAnalyticsDemo

App应用统计分析演示,集合了友盟数据统计/推送,Bugly的日志上报/更新以及美团的多渠道打包等
Java
13
star
46

XNoBug

一个轻量、高扩展性的Android日志上报框架。
Java
12
star
47

SandHookTest

SandHook在Android上的Hook应用
Java
11
star
48

OCRCamera

一个能够快速识别卡片的智能照相机,可配合百度OCR文字识别使用。
Java
9
star
49

GoogleComponentsDemo

Google Architecture Components 演示程序
Java
8
star
50

Navigation_XPage

Google官方Fragment页面框架Navigation和XPage开源框架的使用对比。
Java
8
star
51

AutoSizeTest

使用AndroidAutoSize屏幕适配演示
Java
8
star
52

UtilXX

UtilXX是Android的开源工具框架
Java
8
star
53

PhantomTest

满帮集团插件化框架Phantom使用演示
Java
8
star
54

CameraView

分别使用camera api1、api2和google的CameraView来实现照相机功能
Java
8
star
55

JPushSample

极光推送Android客户端使用指南
Java
7
star
56

UIThemeSample

Android的UI主题使用案例
Kotlin
7
star
57

JNI-CMake

Android使用CMake和Android.mk进行JNI开发演示
C++
6
star
58

WebRTC-Android

WebRTC在Android上的使用
Java
6
star
59

react-native-marquee-textview

MarqueeTextview for React Native
Java
6
star
60

TemplateSimpleProject-databinding

简化版的Android空壳模版工程(kotlin-databinding版本),快速搭建(集成了XUI、XUtil、XAOP、XPage、友盟统计和walle多渠道打包)
Kotlin
6
star
61

TemplateProject

模版空壳Android工程,快速搭建(添加了XUtil、XPage和XAOP)
Java
6
star
62

mace_demo

小米mace 深度学习框架 已经编译成功的android demo
Java
5
star
63

BuglyTest

腾讯Bugly(日志上报、运营统计、应用升级平台)接入演示demo
Java
5
star
64

AndroidStudioTemplates

Android Studio 自定义模板
FreeMarker
5
star
65

order

中小企业的订餐小系统
JavaScript
5
star
66

DeviceMonitor

监测手机或者指定应用的流量
Java
5
star
67

MyMVP

Dagger2 + Dagger2-android + ARouter + ButterKnife + MVP 的使用演示
Java
4
star
68

GreenDaoDemo

GreenDao数据库使用演示
Java
4
star
69

DataBindingSample

DataBinding使用集合
Kotlin
3
star
70

MyMVVM

ARouter + DataBinding + MVVM 的使用演示
Java
3
star
71

Resource

存放资源(图片、视频、gif等)
3
star
72

springboot-grpc-api

基于grpc-spring-boot-starter搭建起的grpc服务
Java
2
star
73

flutter_android_interactive

演示如何在android现有项目中集成flutter项目,进行混合开发
Dart
2
star
74

ComposeDemo

Compose的使用演示
Kotlin
2
star
75

XFtpClient

一个使用C++和java分别实现的FTP客户端
C++
2
star
76

TensorFlowDemo

TensorFlow在Android上使用案例的集合
Java
1
star
77

ImageProcess-Java

图片处理,使用opencv-java接口
Java
1
star
78

XSocialShare

社会化分享SDK
Java
1
star
79

uni-app-learn

uni-app 前端跨平台框架学习Demo
Vue
1
star
80

wechat-app-mall

微信小程序商城
1
star
81

SocialShareDemo

社会化分享演示
Java
1
star
82

xuexiangjys

1
star
83

VirtualApkTest

滴滴的VirtualApk插件化使用演示
Java
1
star