feat: 初次提交
This commit is contained in:
1
app/.gitignore
vendored
Normal file
1
app/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
/build
|
||||
51
app/build.gradle
Normal file
51
app/build.gradle
Normal file
@@ -0,0 +1,51 @@
|
||||
plugins {
|
||||
id 'com.android.application'
|
||||
id 'org.jetbrains.kotlin.android'
|
||||
}
|
||||
|
||||
android {
|
||||
compileSdk 32
|
||||
|
||||
defaultConfig {
|
||||
applicationId "com.navinfo.testapplication"
|
||||
minSdk 23
|
||||
//noinspection ExpiredTargetSdkVersion
|
||||
targetSdk 32
|
||||
versionCode 1
|
||||
versionName "1.0"
|
||||
}
|
||||
buildToolsVersion '29.0.1'
|
||||
buildTypes {
|
||||
release {
|
||||
minifyEnabled true
|
||||
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||
}
|
||||
}
|
||||
compileOptions {
|
||||
sourceCompatibility JavaVersion.VERSION_11
|
||||
targetCompatibility JavaVersion.VERSION_11
|
||||
}
|
||||
buildFeatures {
|
||||
viewBinding true
|
||||
//如果需要下面就取消注释
|
||||
//dataBinding true
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation 'androidx.appcompat:appcompat:1.5.1'
|
||||
implementation 'com.google.android.material:material:1.6.0'
|
||||
implementation "org.jetbrains.kotlin:kotlin-stdlib:1.4.32"
|
||||
// 协程核心库
|
||||
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.3"
|
||||
// 协程Android支持库
|
||||
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.3"
|
||||
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
|
||||
testImplementation 'junit:junit:4.13.2'
|
||||
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
|
||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
|
||||
|
||||
//配合RxJava 使用
|
||||
implementation 'io.reactivex.rxjava2:rxjava:2.2.7'
|
||||
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
|
||||
}
|
||||
21
app/proguard-rules.pro
vendored
Normal file
21
app/proguard-rules.pro
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
# Add project specific ProGuard rules here.
|
||||
# You can control the set of applied configuration files using the
|
||||
# proguardFiles setting in build.gradle.
|
||||
#
|
||||
# For more details, see
|
||||
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||
|
||||
# If your project uses WebView with JS, uncomment the following
|
||||
# and specify the fully qualified class name to the JavaScript interface
|
||||
# class:
|
||||
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||
# public *;
|
||||
#}
|
||||
|
||||
# Uncomment this to preserve the line number information for
|
||||
# debugging stack traces.
|
||||
#-keepattributes SourceFile,LineNumberTable
|
||||
|
||||
# If you keep the line number information, uncomment this to
|
||||
# hide the original source file name.
|
||||
#-renamesourcefileattribute SourceFile
|
||||
@@ -0,0 +1,26 @@
|
||||
package com.navinfo.testapplication;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import androidx.test.platform.app.InstrumentationRegistry;
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
* Instrumented test, which will execute on an Android device.
|
||||
*
|
||||
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
|
||||
*/
|
||||
@RunWith(AndroidJUnit4.class)
|
||||
public class ExampleInstrumentedTest {
|
||||
@Test
|
||||
public void useAppContext() {
|
||||
// Context of the app under test.
|
||||
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
|
||||
assertEquals("com.navinfo.testapplication", appContext.getPackageName());
|
||||
}
|
||||
}
|
||||
28
app/src/main/AndroidManifest.xml
Normal file
28
app/src/main/AndroidManifest.xml
Normal file
@@ -0,0 +1,28 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
package="com.navinfo.testapplication">
|
||||
|
||||
<application
|
||||
android:allowBackup="true"
|
||||
android:excludeFromRecents="true"
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
android:label="@string/app_name"
|
||||
android:theme="@style/Theme.TestApplication">
|
||||
<!-- <service-->
|
||||
<!-- android:name=".MyService"-->
|
||||
<!-- android:enabled="true"-->
|
||||
<!-- android:exported="true"></service>-->
|
||||
|
||||
<activity
|
||||
android:name=".RxAndroidActivity"
|
||||
android:exported="true">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
</application>
|
||||
|
||||
</manifest>
|
||||
@@ -0,0 +1,58 @@
|
||||
package com.navinfo.testapplication
|
||||
|
||||
import android.os.Bundle
|
||||
import android.os.PersistableBundle
|
||||
import android.util.Log
|
||||
import android.view.LayoutInflater
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import com.navinfo.testapplication.databinding.ActivityMainBinding
|
||||
import io.reactivex.Observable
|
||||
import io.reactivex.ObservableEmitter
|
||||
import io.reactivex.ObservableOnSubscribe
|
||||
import kotlinx.coroutines.GlobalScope
|
||||
import kotlinx.coroutines.async
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.runBlocking
|
||||
|
||||
class MainActivity : AppCompatActivity {
|
||||
private val mainBinding by lazy { ActivityMainBinding.inflate(LayoutInflater.from(MainActivity@this)) }
|
||||
|
||||
constructor()
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
|
||||
super.onCreate(savedInstanceState, persistentState)
|
||||
val listData = 1..20
|
||||
// 最简单的RxJava示例
|
||||
mainBinding.btnRxjava1.setOnClickListener {
|
||||
Observable.create<String>{
|
||||
for (i in listData) {
|
||||
it.onNext(i.toString())
|
||||
}
|
||||
it.onComplete()
|
||||
}.subscribe {
|
||||
println(it)
|
||||
}
|
||||
}
|
||||
|
||||
mainBinding.btnStartCoroutine.setOnClickListener {
|
||||
startCorourtine()
|
||||
}
|
||||
}
|
||||
|
||||
private fun startCorourtine() {
|
||||
// 调用阻塞式协程
|
||||
runBlocking {
|
||||
Log.d("runBlocking", "启动一个协程")
|
||||
}
|
||||
|
||||
// 调用launch启动协程
|
||||
GlobalScope.launch {
|
||||
Log.d("launch", "启动一个协程")
|
||||
}
|
||||
|
||||
// 调用async启动协程
|
||||
GlobalScope.async {
|
||||
Log.d("async", "启动一个协程")
|
||||
}
|
||||
}
|
||||
}
|
||||
36
app/src/main/java/com/navinfo/testapplication/MyService.java
Normal file
36
app/src/main/java/com/navinfo/testapplication/MyService.java
Normal file
@@ -0,0 +1,36 @@
|
||||
package com.navinfo.testapplication;
|
||||
|
||||
import android.app.Service;
|
||||
import android.content.Intent;
|
||||
import android.os.IBinder;
|
||||
import android.util.Log;
|
||||
|
||||
public class MyService extends Service {
|
||||
public MyService() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public IBinder onBind(Intent intent) {
|
||||
// TODO: Return the communication channel to the service.
|
||||
// throw new UnsupportedOperationException("Not yet implemented");
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate() {
|
||||
super.onCreate();
|
||||
Log.d("MyService", "Service-Create");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
super.onDestroy();
|
||||
Log.d("MyService", "Service-Destroy");
|
||||
}
|
||||
|
||||
@Override
|
||||
public int onStartCommand(Intent intent, int flags, int startId) {
|
||||
Log.d("MyService", "服务已启动");
|
||||
return super.onStartCommand(intent, flags, startId);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package com.navinfo.testapplication
|
||||
|
||||
class NewKotlinFragment {
|
||||
}
|
||||
@@ -0,0 +1,352 @@
|
||||
package com.navinfo.testapplication;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
|
||||
import com.navinfo.testapplication.databinding.ActivityRxandroidBinding;
|
||||
|
||||
import org.reactivestreams.Subscription;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import io.reactivex.BackpressureStrategy;
|
||||
import io.reactivex.Flowable;
|
||||
import io.reactivex.FlowableEmitter;
|
||||
import io.reactivex.FlowableOnSubscribe;
|
||||
import io.reactivex.FlowableSubscriber;
|
||||
import io.reactivex.Observable;
|
||||
import io.reactivex.ObservableEmitter;
|
||||
import io.reactivex.ObservableOnSubscribe;
|
||||
import io.reactivex.Observer;
|
||||
import io.reactivex.android.schedulers.AndroidSchedulers;
|
||||
import io.reactivex.disposables.Disposable;
|
||||
import io.reactivex.functions.BiFunction;
|
||||
import io.reactivex.functions.Consumer;
|
||||
import io.reactivex.functions.Function;
|
||||
import io.reactivex.schedulers.Schedulers;
|
||||
|
||||
public class RxAndroidActivity extends AppCompatActivity {
|
||||
private String TAG = "RxAndroidActivity";
|
||||
private ActivityRxandroidBinding binding;
|
||||
// RxAndroid测试需要使用的数据
|
||||
private List<String> listData = new ArrayList<>();
|
||||
private Disposable disposable;
|
||||
private Subscription subscription;
|
||||
@Override
|
||||
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
binding = ActivityRxandroidBinding.inflate(LayoutInflater.from(this));
|
||||
setContentView(binding.getRoot());
|
||||
|
||||
for (int i = 0; i < 50; i++) {
|
||||
listData.add(i+"");
|
||||
}
|
||||
|
||||
// 最简单的RxAndroid程序
|
||||
binding.rxSimple1.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
Observable.create(new ObservableOnSubscribe<String>() {
|
||||
@Override
|
||||
public void subscribe(ObservableEmitter<String> emitter) throws Exception {
|
||||
for (String str: listData
|
||||
) {
|
||||
emitter.onNext(str);
|
||||
Log.d(TAG, "发送数据:"+str);
|
||||
}
|
||||
}
|
||||
}).subscribe();
|
||||
}
|
||||
});
|
||||
|
||||
// 上下游演示
|
||||
binding.rxSimple2.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
// Observable.fromIterable(listData)
|
||||
Observable.create(new ObservableOnSubscribe<String>() {
|
||||
@Override
|
||||
public void subscribe(ObservableEmitter<String> emitter) throws Exception {
|
||||
for (int i = 0; i < 3; i++) {
|
||||
emitter.onNext("异常前的数据:"+listData.get(i));
|
||||
}
|
||||
emitter.onComplete();
|
||||
if (!disposable.isDisposed()) {
|
||||
emitter.onError(new Throwable("出现异常!"));
|
||||
for (int i = 0; i < listData.size(); i++) {
|
||||
emitter.onNext("异常后的数据:"+listData.get(i));
|
||||
}
|
||||
emitter.onComplete();
|
||||
}
|
||||
}
|
||||
})
|
||||
.subscribe(new Observer<String>() {
|
||||
@Override
|
||||
public void onSubscribe(Disposable d) {
|
||||
// 订阅开始
|
||||
Log.d(TAG, "订阅开始");
|
||||
disposable = d;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNext(String s) {
|
||||
// 对单个要素执行操作
|
||||
Log.d(TAG, "接受数据:"+s);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(Throwable e) {
|
||||
// 异常
|
||||
Log.d(TAG, "出现异常");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onComplete() {
|
||||
// 完成
|
||||
Log.d(TAG, "执行完成");
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// 线程演示
|
||||
binding.rxSimple3.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
// Observable.fromIterable(listData)
|
||||
Observable.create(new ObservableOnSubscribe<String>() {
|
||||
@Override
|
||||
public void subscribe(ObservableEmitter<String> emitter) throws Exception {
|
||||
for (int i = 0; i < listData.size(); i++) {
|
||||
if (!disposable.isDisposed()) {
|
||||
emitter.onNext(listData.get(i));
|
||||
Log.d(TAG, "发送数据:"+listData.get(i)+",当前线程:"+Thread.currentThread().getName());
|
||||
}
|
||||
}
|
||||
emitter.onComplete();
|
||||
}
|
||||
})
|
||||
// .subscribeOn(Schedulers.io())
|
||||
.subscribeOn(AndroidSchedulers.mainThread())
|
||||
.observeOn(Schedulers.newThread())
|
||||
.doOnNext(new Consumer<String>() {
|
||||
@Override
|
||||
public void accept(String s) throws Exception {
|
||||
Log.d(TAG, "doOnNext:"+s+",当前线程:"+Thread.currentThread().getName());
|
||||
}
|
||||
})
|
||||
.observeOn(Schedulers.computation())
|
||||
.subscribe(new Observer<String>() {
|
||||
@Override
|
||||
public void onSubscribe(Disposable d) {
|
||||
// 订阅开始
|
||||
Log.d(TAG, "订阅开始"+",当前线程:"+Thread.currentThread().getName());
|
||||
disposable = d;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNext(String s) {
|
||||
// 对单个要素执行操作
|
||||
Log.d(TAG, "接受数据:"+s+",当前线程:"+Thread.currentThread().getName());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(Throwable e) {
|
||||
// 异常
|
||||
Log.d(TAG, "出现异常"+",当前线程:"+Thread.currentThread().getName());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onComplete() {
|
||||
// 完成
|
||||
Log.d(TAG, "执行完成"+",当前线程:"+Thread.currentThread().getName());
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// RxAndroid的操作符演示
|
||||
binding.rxSimple4.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
// Observable.fromIterable(listData)
|
||||
// Observable.create(new ObservableOnSubscribe<String>() {
|
||||
// @Override
|
||||
// public void subscribe(ObservableEmitter<String> emitter) throws Exception {
|
||||
// for (int i = 0; i < listData.size(); i++) {
|
||||
// if (!disposable.isDisposed()) {
|
||||
// emitter.onNext(listData.get(i));
|
||||
// Log.d(TAG, "发送数据:"+listData.get(i)+",当前线程:"+Thread.currentThread().getName());
|
||||
// }
|
||||
// }
|
||||
// emitter.onComplete();
|
||||
// }
|
||||
// })
|
||||
// .subscribeOn(AndroidSchedulers.mainThread())
|
||||
// .observeOn(Schedulers.newThread())
|
||||
// .map(new Function<String, Integer>() {
|
||||
// @Override
|
||||
// public Integer apply(String s) throws Exception {
|
||||
// return Integer.valueOf(s);
|
||||
// }
|
||||
// })
|
||||
// .observeOn(Schedulers.computation())
|
||||
// .subscribe(new Observer<Integer>() {
|
||||
// @Override
|
||||
// public void onSubscribe(Disposable d) {
|
||||
// // 订阅开始
|
||||
// Log.d(TAG, "订阅开始"+",当前线程:"+Thread.currentThread().getName());
|
||||
// disposable = d;
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void onNext(Integer s) {
|
||||
// // 对单个要素执行操作
|
||||
// Log.d(TAG, "接受数据:"+s+",当前线程:"+Thread.currentThread().getName());
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void onError(Throwable e) {
|
||||
// // 异常
|
||||
// Log.d(TAG, "出现异常"+",当前线程:"+Thread.currentThread().getName());
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void onComplete() {
|
||||
// // 完成
|
||||
// Log.d(TAG, "执行完成"+",当前线程:"+Thread.currentThread().getName());
|
||||
// }
|
||||
// });
|
||||
|
||||
Observable<String> observable1 = Observable.intervalRange(1, Integer.MAX_VALUE, 0, 1000, TimeUnit.MILLISECONDS).subscribeOn(Schedulers.computation()).map(new Function<Long, String>() {
|
||||
@Override
|
||||
public String apply(Long aLong) throws Exception {
|
||||
return String.valueOf(aLong);
|
||||
}
|
||||
});
|
||||
Observable<String> observable2 = Observable.fromArray("A","B","C", "D").subscribeOn(Schedulers.io());
|
||||
// Observable.concat(observable1, observable2)
|
||||
// .observeOn(Schedulers.computation())
|
||||
// .doOnNext(new Consumer<String>() {
|
||||
// @Override
|
||||
// public void accept(String s) throws Exception {
|
||||
// Log.d(TAG, "doOnNext:"+s);
|
||||
// }
|
||||
// }).subscribe();
|
||||
// Observable.merge(observable1, observable2)
|
||||
// .observeOn(Schedulers.newThread())
|
||||
// .subscribe(new Consumer<String>() {
|
||||
// @Override
|
||||
// public void accept(String s) throws Exception {
|
||||
// Log.d(TAG, "OnNext:"+s);
|
||||
// }
|
||||
// });
|
||||
|
||||
Observable.zip(observable1, observable2, new BiFunction<String, String, String>() {
|
||||
@Override
|
||||
public String apply(String s, String s2) throws Exception {
|
||||
return s+":"+s2;
|
||||
}
|
||||
})
|
||||
.subscribe(new Observer<String>() {
|
||||
@Override
|
||||
public void onSubscribe(Disposable d) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNext(String s) {
|
||||
Log.d(TAG, "OnNext:"+s);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(Throwable e) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onComplete() {
|
||||
Log.d(TAG, "onComplete");
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// 背压
|
||||
binding.rxSimple5.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
// Observable.create(new ObservableOnSubscribe<String>() {
|
||||
// @Override
|
||||
// public void subscribe(ObservableEmitter<String> emitter) throws Exception {
|
||||
// for (int i = 0; i < Integer.MAX_VALUE; i++) {
|
||||
// emitter.onNext(i+"");
|
||||
// }
|
||||
// emitter.onComplete();
|
||||
// }
|
||||
// })
|
||||
// .subscribeOn(Schedulers.io())
|
||||
// .observeOn(Schedulers.computation())
|
||||
// .subscribe(new Consumer<String>() {
|
||||
// @Override
|
||||
// public void accept(String s) throws Exception {
|
||||
// Thread.sleep(1000);
|
||||
// Log.d(TAG, "OnNext:"+s);
|
||||
// }
|
||||
// });
|
||||
Flowable.create(new FlowableOnSubscribe<String>() {
|
||||
@Override
|
||||
public void subscribe(FlowableEmitter<String> emitter) throws Exception {
|
||||
int i = 1;
|
||||
while (true) {
|
||||
if (emitter.requested()>0) {
|
||||
Log.d(TAG, "前requested:"+emitter.requested());
|
||||
emitter.onNext((i++)+"");
|
||||
Log.d(TAG, "后requested:"+emitter.requested());
|
||||
Log.d(TAG, "背压发送数据:"+i+",当前的requested:"+emitter.requested());
|
||||
} else {
|
||||
Thread.sleep(1000);
|
||||
}
|
||||
}
|
||||
}
|
||||
}, BackpressureStrategy.BUFFER)
|
||||
.observeOn(Schedulers.computation())
|
||||
.subscribe(new FlowableSubscriber<String>() {
|
||||
@Override
|
||||
public void onSubscribe(Subscription s) {
|
||||
subscription = s;
|
||||
s.request(1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNext(String s) {
|
||||
try {
|
||||
Thread.sleep(100);
|
||||
Log.d(TAG, "OnNext:"+s);
|
||||
subscription.request(1);
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(Throwable t) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onComplete() {
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
28
app/src/main/res/layout/activity_main.xml
Normal file
28
app/src/main/res/layout/activity_main.xml
Normal file
@@ -0,0 +1,28 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical"
|
||||
tools:context=".MainActivity">
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:layout_centerInParent="true">
|
||||
<androidx.appcompat.widget.AppCompatButton
|
||||
android:id="@+id/btn_rxjava1"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
style="@style/Widget.AppCompat.Button.Colored"
|
||||
android:text="最简单的RxJava示例"></androidx.appcompat.widget.AppCompatButton>
|
||||
|
||||
<Button
|
||||
android:id="@+id/btn_start_coroutine"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_centerInParent="true"
|
||||
android:text="启动协程"></Button>
|
||||
</LinearLayout>
|
||||
</RelativeLayout>
|
||||
41
app/src/main/res/layout/activity_rxandroid.xml
Normal file
41
app/src/main/res/layout/activity_rxandroid.xml
Normal file
@@ -0,0 +1,41 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_centerInParent="true"
|
||||
android:orientation="vertical">
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/rx_simple_1"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="最简单的RxAndroid程序">
|
||||
</com.google.android.material.button.MaterialButton>
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/rx_simple_2"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="上下游演示">
|
||||
</com.google.android.material.button.MaterialButton>
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/rx_simple_3"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="线程演示">
|
||||
</com.google.android.material.button.MaterialButton>
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/rx_simple_4"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="操作符演示">
|
||||
</com.google.android.material.button.MaterialButton>
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/rx_simple_5"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="背压">
|
||||
</com.google.android.material.button.MaterialButton>
|
||||
</LinearLayout>
|
||||
</RelativeLayout>
|
||||
BIN
app/src/main/res/mipmap/ic_launcher.webp
Normal file
BIN
app/src/main/res/mipmap/ic_launcher.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.8 KiB |
3
app/src/main/res/values/strings.xml
Normal file
3
app/src/main/res/values/strings.xml
Normal file
@@ -0,0 +1,3 @@
|
||||
<resources>
|
||||
<string name="app_name">TestApplication</string>
|
||||
</resources>
|
||||
5
app/src/main/res/values/themes.xml
Normal file
5
app/src/main/res/values/themes.xml
Normal file
@@ -0,0 +1,5 @@
|
||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||
<!-- Base application theme. -->
|
||||
<style name="Theme.TestApplication" parent="@style/Theme.MaterialComponents.Light">
|
||||
</style>
|
||||
</resources>
|
||||
13
app/src/main/res/xml/backup_rules.xml
Normal file
13
app/src/main/res/xml/backup_rules.xml
Normal file
@@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><!--
|
||||
Sample backup rules file; uncomment and customize as necessary.
|
||||
See https://developer.android.com/guide/topics/data/autobackup
|
||||
for details.
|
||||
Note: This file is ignored for devices older that API 31
|
||||
See https://developer.android.com/about/versions/12/backup-restore
|
||||
-->
|
||||
<full-backup-content>
|
||||
<!--
|
||||
<include domain="sharedpref" path="."/>
|
||||
<exclude domain="sharedpref" path="device.xml"/>
|
||||
-->
|
||||
</full-backup-content>
|
||||
19
app/src/main/res/xml/data_extraction_rules.xml
Normal file
19
app/src/main/res/xml/data_extraction_rules.xml
Normal file
@@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><!--
|
||||
Sample data extraction rules file; uncomment and customize as necessary.
|
||||
See https://developer.android.com/about/versions/12/backup-restore#xml-changes
|
||||
for details.
|
||||
-->
|
||||
<data-extraction-rules>
|
||||
<cloud-backup>
|
||||
<!-- TODO: Use <include> and <exclude> to control what is backed up.
|
||||
<include .../>
|
||||
<exclude .../>
|
||||
-->
|
||||
</cloud-backup>
|
||||
<!--
|
||||
<device-transfer>
|
||||
<include .../>
|
||||
<exclude .../>
|
||||
</device-transfer>
|
||||
-->
|
||||
</data-extraction-rules>
|
||||
@@ -0,0 +1,17 @@
|
||||
package com.navinfo.testapplication;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
* Example local unit test, which will execute on the development machine (host).
|
||||
*
|
||||
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
|
||||
*/
|
||||
public class ExampleUnitTest {
|
||||
@Test
|
||||
public void addition_isCorrect() {
|
||||
assertEquals(4, 2 + 2);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user