├── .gitignore ├── DataLoader ├── .gitignore ├── apps │ ├── app │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── proguard-rules.pro │ │ └── src │ │ │ ├── androidTest │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── jeremyliao │ │ │ │ └── dataloader │ │ │ │ └── app │ │ │ │ ├── DataLoaderTest.java │ │ │ │ └── wrapper │ │ │ │ └── Wrapper.java │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── jeremyliao │ │ │ │ │ └── dataloader │ │ │ │ │ └── app │ │ │ │ │ ├── MainActivity.java │ │ │ │ │ ├── PreLoadBeforeLaunchActivity.java │ │ │ │ │ └── TestActivity.java │ │ │ └── res │ │ │ │ ├── drawable-v24 │ │ │ │ └── ic_launcher_foreground.xml │ │ │ │ ├── drawable │ │ │ │ └── ic_launcher_background.xml │ │ │ │ ├── layout │ │ │ │ ├── activity_main.xml │ │ │ │ └── activity_preload.xml │ │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ ├── ic_launcher.xml │ │ │ │ └── ic_launcher_round.xml │ │ │ │ ├── mipmap-hdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ └── values │ │ │ │ ├── colors.xml │ │ │ │ ├── strings.xml │ │ │ │ └── styles.xml │ │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── jeremyliao │ │ │ └── dataloader │ │ │ └── app │ │ │ └── ExampleUnitTest.java │ └── demo │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── proguard-rules.pro │ │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── jeremyliao │ │ │ └── dataloader │ │ │ └── demo │ │ │ └── ExampleInstrumentedTest.java │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── com │ │ │ └── jeremyliao │ │ │ └── dataloader │ │ │ └── demo │ │ │ ├── MainActivity.java │ │ │ ├── application │ │ │ └── DemoApplication.java │ │ │ ├── bean │ │ │ ├── CommonParam.java │ │ │ ├── CommonResult.java │ │ │ ├── DemoParam.java │ │ │ └── DemoResult.java │ │ │ └── dataload │ │ │ ├── DataLoadDemo1.java │ │ │ ├── DataLoadDemo10.java │ │ │ ├── DataLoadDemo11.java │ │ │ ├── DataLoadDemo12.java │ │ │ ├── DataLoadDemo13.java │ │ │ ├── DataLoadDemo14.java │ │ │ ├── DataLoadDemo15.java │ │ │ ├── DataLoadDemo2.java │ │ │ ├── DataLoadDemo3.java │ │ │ ├── DataLoadDemo4.java │ │ │ ├── DataLoadDemo5.java │ │ │ ├── DataLoadDemo6.java │ │ │ ├── DataLoadDemo7.java │ │ │ ├── DataLoadDemo8.java │ │ │ └── DataLoadDemo9.java │ │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ └── ic_launcher_background.xml │ │ ├── layout │ │ └── activity_main.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml ├── build.gradle ├── dataloader-v1 │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── jeremyliao │ │ │ └── dataloader │ │ │ └── ExampleInstrumentedTest.java │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── jeremyliao │ │ │ │ └── dataloader │ │ │ │ ├── DataLoader.java │ │ │ │ ├── core │ │ │ │ ├── DataLoadTask.java │ │ │ │ └── DataLoaderManager.java │ │ │ │ ├── interfaces │ │ │ │ ├── LoadListener.java │ │ │ │ └── LoadTask.java │ │ │ │ └── utils │ │ │ │ └── ThreadUtils.java │ │ └── res │ │ │ └── values │ │ │ └── strings.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── jeremyliao │ │ └── dataloader │ │ └── ExampleUnitTest.java ├── dataloader-v2 │ ├── base │ │ ├── .gitignore │ │ ├── build.gradle │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── com │ │ │ └── jeremyliao │ │ │ └── dataloader │ │ │ └── base │ │ │ ├── annotation │ │ │ └── DataLoad.java │ │ │ ├── common │ │ │ └── LoaderInfo.java │ │ │ └── utils │ │ │ └── EncryptUtils.java │ ├── compiler │ │ ├── .gitignore │ │ ├── build.gradle │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── com │ │ │ └── jeremyliao │ │ │ └── dataloader │ │ │ └── compiler │ │ │ └── processor │ │ │ ├── DataLoaderProcessor.java │ │ │ └── base │ │ │ └── LoaderType.java │ ├── core │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── proguard-rules.pro │ │ └── src │ │ │ └── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── java │ │ │ └── com │ │ │ │ └── jeremyliao │ │ │ │ └── dataloader │ │ │ │ └── core │ │ │ │ ├── DataLoader.java │ │ │ │ ├── common │ │ │ │ └── Const.java │ │ │ │ ├── helper │ │ │ │ └── LoaderInfoHelper.java │ │ │ │ ├── loader │ │ │ │ ├── BaseDataLoader.java │ │ │ │ ├── CallableDataLoader.java │ │ │ │ ├── CallableDataLoader0.java │ │ │ │ ├── CallableDataLoader1.java │ │ │ │ ├── CallableDataLoader2.java │ │ │ │ ├── CallableDataLoader3.java │ │ │ │ ├── CallableDataLoader4.java │ │ │ │ ├── CallableDataLoader5.java │ │ │ │ ├── CallableDataLoader6.java │ │ │ │ ├── CallableDataLoader7.java │ │ │ │ ├── CallableDataLoader8.java │ │ │ │ ├── CallableDataLoader9.java │ │ │ │ ├── CallableDataLoaderN.java │ │ │ │ ├── LiveDataLoader.java │ │ │ │ ├── LiveDataLoader0.java │ │ │ │ ├── LiveDataLoader1.java │ │ │ │ ├── LiveDataLoader2.java │ │ │ │ ├── LiveDataLoader3.java │ │ │ │ ├── LiveDataLoader4.java │ │ │ │ ├── LiveDataLoader5.java │ │ │ │ ├── LiveDataLoader6.java │ │ │ │ ├── LiveDataLoader7.java │ │ │ │ ├── LiveDataLoader8.java │ │ │ │ ├── LiveDataLoader9.java │ │ │ │ └── LiveDataLoaderN.java │ │ │ │ ├── source │ │ │ │ └── DataSource.java │ │ │ │ └── utils │ │ │ │ └── GenericsUtils.java │ │ │ └── res │ │ │ └── values │ │ │ └── strings.xml │ └── loader-plugin │ │ ├── .gitignore │ │ ├── build.gradle │ │ └── src │ │ └── main │ │ ├── java │ │ └── com │ │ │ └── jeremyliao │ │ │ └── dataloader │ │ │ └── plugin │ │ │ ├── common │ │ │ ├── Const.java │ │ │ └── LoaderInfo.java │ │ │ ├── plugin │ │ │ └── DataLoaderPlugin.java │ │ │ ├── transform │ │ │ └── DataLoaderTransform.java │ │ │ └── utils │ │ │ ├── GradleUtils.java │ │ │ └── ModifyUtils.java │ │ └── resources │ │ └── META-INF │ │ └── gradle-plugins │ │ └── loader-plugin.properties ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle ├── LICENSE └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | # Built application files 2 | *.apk 3 | *.ap_ 4 | 5 | # Files for the ART/Dalvik VM 6 | *.dex 7 | 8 | # Java class files 9 | *.class 10 | 11 | # Generated files 12 | bin/ 13 | gen/ 14 | out/ 15 | 16 | # Gradle files 17 | .gradle/ 18 | build/ 19 | 20 | # Local configuration file (sdk path, etc) 21 | local.properties 22 | 23 | # Proguard folder generated by Eclipse 24 | proguard/ 25 | 26 | # Log Files 27 | *.log 28 | 29 | # Android Studio Navigation editor temp files 30 | .navigation/ 31 | 32 | # Android Studio captures folder 33 | captures/ 34 | 35 | # IntelliJ 36 | *.iml 37 | .idea/workspace.xml 38 | .idea/tasks.xml 39 | .idea/gradle.xml 40 | .idea/assetWizardSettings.xml 41 | .idea/dictionaries 42 | .idea/libraries 43 | .idea/caches 44 | 45 | # Keystore files 46 | # Uncomment the following line if you do not want to check your keystore files in. 47 | #*.jks 48 | 49 | # External native build folder generated in Android Studio 2.2 and later 50 | .externalNativeBuild 51 | 52 | # Google Services (e.g. APIs or Firebase) 53 | google-services.json 54 | 55 | # Freeline 56 | freeline.py 57 | freeline/ 58 | freeline_project_description.json 59 | 60 | # fastlane 61 | fastlane/report.xml 62 | fastlane/Preview.html 63 | fastlane/screenshots 64 | fastlane/test_output 65 | fastlane/readme.md 66 | 67 | release 68 | target 69 | build 70 | .settings 71 | .project 72 | .classpath 73 | .idea 74 | .DS_Store 75 | bin 76 | gen 77 | proguard 78 | .pmd 79 | *~ 80 | *.iml 81 | tmp 82 | gen-external-apklibs 83 | out 84 | tmp 85 | coverage 86 | build/ 87 | .gradle/ 88 | local.properties 89 | .gradletasknamecache 90 | src/main/provided_libs 91 | src/main/assets/*.dex 92 | src/main/assets/mtdata*.json 93 | reports/ 94 | aartojar/ 95 | keystore 96 | captures 97 | repo/ 98 | -------------------------------------------------------------------------------- /DataLoader/.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | -------------------------------------------------------------------------------- /DataLoader/apps/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /DataLoader/apps/app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 28 5 | defaultConfig { 6 | applicationId "com.jeremyliao.dataloader.app" 7 | minSdkVersion 14 8 | targetSdkVersion 28 9 | versionCode 1 10 | versionName "1.0" 11 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 12 | } 13 | buildTypes { 14 | release { 15 | minifyEnabled false 16 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 17 | } 18 | } 19 | } 20 | 21 | dependencies { 22 | implementation fileTree(include: ['*.jar'], dir: 'libs') 23 | implementation 'com.android.support:appcompat-v7:28.0.0' 24 | implementation 'com.android.support.constraint:constraint-layout:1.1.3' 25 | testImplementation 'junit:junit:4.12' 26 | androidTestImplementation 'com.android.support.test:runner:1.0.2' 27 | androidTestImplementation 'com.android.support.test:rules:1.0.2' 28 | androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' 29 | implementation project(':dataloader-v1') 30 | } 31 | -------------------------------------------------------------------------------- /DataLoader/apps/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /DataLoader/apps/app/src/androidTest/java/com/jeremyliao/dataloader/app/DataLoaderTest.java: -------------------------------------------------------------------------------- 1 | package com.jeremyliao.dataloader.app; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.rule.ActivityTestRule; 6 | import android.support.test.runner.AndroidJUnit4; 7 | 8 | import com.jeremyliao.dataloader.DataLoader; 9 | import com.jeremyliao.dataloader.app.wrapper.Wrapper; 10 | import com.jeremyliao.dataloader.interfaces.LoadListener; 11 | import com.jeremyliao.dataloader.interfaces.LoadTask; 12 | 13 | import org.junit.Assert; 14 | import org.junit.Rule; 15 | import org.junit.Test; 16 | import org.junit.runner.RunWith; 17 | 18 | import static org.junit.Assert.assertEquals; 19 | 20 | 21 | @RunWith(AndroidJUnit4.class) 22 | public class DataLoaderTest { 23 | 24 | @Rule 25 | public ActivityTestRule rule = new ActivityTestRule<>(TestActivity.class); 26 | 27 | @Test 28 | public void testContext() { 29 | Context appContext = InstrumentationRegistry.getTargetContext(); 30 | assertEquals("com.jeremyliao.dataloader.app", appContext.getPackageName()); 31 | } 32 | 33 | @Test 34 | public void testLoadData1() { 35 | final Wrapper result = new Wrapper<>(null); 36 | final int id = DataLoader.load(new LoadTask() { 37 | @Override 38 | public String loadData() { 39 | sleep(1000); 40 | return "hello"; 41 | } 42 | }); 43 | rule.getActivity().runOnUiThread(new Runnable() { 44 | @Override 45 | public void run() { 46 | DataLoader.listen(id, rule.getActivity(), new LoadListener() { 47 | @Override 48 | public void onDataArrived(String data) { 49 | result.setTarget(data); 50 | } 51 | }); 52 | } 53 | }); 54 | sleep(2000); 55 | Assert.assertEquals(result.getTarget(), "hello"); 56 | } 57 | 58 | @Test 59 | public void testLoadData2() { 60 | final Wrapper result = new Wrapper<>(null); 61 | final int id = DataLoader.load(new LoadTask() { 62 | @Override 63 | public String loadData() { 64 | sleep(1000); 65 | return "hello"; 66 | } 67 | }); 68 | DataLoader.listen(id, rule.getActivity(), new LoadListener() { 69 | @Override 70 | public void onDataArrived(String data) { 71 | result.setTarget(data); 72 | } 73 | }); 74 | sleep(2000); 75 | Assert.assertEquals(result.getTarget(), "hello"); 76 | } 77 | 78 | @Test 79 | public void testLoadData3() { 80 | final Wrapper result = new Wrapper<>(null); 81 | final int id = DataLoader.load(new LoadTask() { 82 | @Override 83 | public String loadData() { 84 | sleep(1000); 85 | return "hello"; 86 | } 87 | }, new LoadListener() { 88 | @Override 89 | public void onDataArrived(String data) { 90 | result.setTarget(data); 91 | } 92 | }); 93 | sleep(2000); 94 | Assert.assertEquals(result.getTarget(), "hello"); 95 | } 96 | 97 | @Test 98 | public void testLoadData4() { 99 | final Wrapper result = new Wrapper<>(null); 100 | final int id = DataLoader.load(new LoadTask() { 101 | @Override 102 | public String loadData() { 103 | sleep(1000); 104 | return "hello"; 105 | } 106 | }); 107 | LoadListener listener = new LoadListener() { 108 | @Override 109 | public void onDataArrived(String data) { 110 | result.setTarget(data); 111 | } 112 | }; 113 | DataLoader.listen(id, listener); 114 | sleep(2000); 115 | DataLoader.removeListener(id, listener); 116 | Assert.assertEquals(result.getTarget(), "hello"); 117 | } 118 | 119 | @Test 120 | public void testLoadData5() { 121 | final Wrapper result = new Wrapper<>(null); 122 | final int id = DataLoader.load(new LoadTask() { 123 | @Override 124 | public String loadData() { 125 | sleep(500); 126 | return "hello"; 127 | } 128 | }); 129 | sleep(1000); 130 | DataLoader.listen(id, rule.getActivity(), new LoadListener() { 131 | @Override 132 | public void onDataArrived(String data) { 133 | result.setTarget(data); 134 | } 135 | }); 136 | sleep(1000); 137 | Assert.assertEquals(result.getTarget(), "hello"); 138 | } 139 | 140 | @Test 141 | public void testLoadData6() { 142 | final Wrapper result = new Wrapper<>(null); 143 | final int id = DataLoader.load(rule.getActivity(), 144 | new LoadTask() { 145 | @Override 146 | public String loadData() { 147 | sleep(1000); 148 | return "hello"; 149 | } 150 | }, new LoadListener() { 151 | @Override 152 | public void onDataArrived(String data) { 153 | result.setTarget(data); 154 | } 155 | }); 156 | sleep(2000); 157 | Assert.assertEquals(result.getTarget(), "hello"); 158 | } 159 | 160 | @Test 161 | public void testExist() { 162 | final int id = DataLoader.load(new LoadTask() { 163 | @Override 164 | public String loadData() { 165 | sleep(1000); 166 | return "hello"; 167 | } 168 | }); 169 | Assert.assertTrue(DataLoader.exists(id)); 170 | } 171 | 172 | @Test 173 | public void testRefresh() { 174 | final Wrapper result = new Wrapper<>(0); 175 | final int id = DataLoader.load(new LoadTask() { 176 | @Override 177 | public String loadData() { 178 | sleep(500); 179 | return "hello"; 180 | } 181 | }); 182 | DataLoader.listen(id, rule.getActivity(), new LoadListener() { 183 | @Override 184 | public void onDataArrived(String data) { 185 | result.setTarget(result.getTarget() + 1); 186 | } 187 | }); 188 | sleep(500); 189 | DataLoader.refresh(id); 190 | sleep(2000); 191 | Assert.assertEquals(result.getTarget().intValue(), 2); 192 | } 193 | 194 | private void sleep(long millis) { 195 | try { 196 | Thread.sleep(millis); 197 | } catch (InterruptedException e) { 198 | e.printStackTrace(); 199 | } 200 | } 201 | } 202 | -------------------------------------------------------------------------------- /DataLoader/apps/app/src/androidTest/java/com/jeremyliao/dataloader/app/wrapper/Wrapper.java: -------------------------------------------------------------------------------- 1 | package com.jeremyliao.dataloader.app.wrapper; 2 | 3 | /** 4 | * Created by liaohailiang on 2019/3/26. 5 | */ 6 | public class Wrapper { 7 | 8 | private T target; 9 | 10 | public Wrapper(T target) { 11 | this.target = target; 12 | } 13 | 14 | public T getTarget() { 15 | return target; 16 | } 17 | 18 | public void setTarget(T target) { 19 | this.target = target; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /DataLoader/apps/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /DataLoader/apps/app/src/main/java/com/jeremyliao/dataloader/app/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.jeremyliao.dataloader.app; 2 | 3 | import android.content.Intent; 4 | import android.support.v7.app.AppCompatActivity; 5 | import android.os.Bundle; 6 | import android.view.View; 7 | 8 | import com.jeremyliao.dataloader.DataLoader; 9 | import com.jeremyliao.dataloader.interfaces.LoadTask; 10 | 11 | public class MainActivity extends AppCompatActivity { 12 | 13 | @Override 14 | protected void onCreate(Bundle savedInstanceState) { 15 | super.onCreate(savedInstanceState); 16 | setContentView(R.layout.activity_main); 17 | } 18 | 19 | public void load(View v) { 20 | int preLoaderId = DataLoader.load(new LoadTask() { 21 | @Override 22 | public String loadData() { 23 | try { 24 | Thread.sleep(1000); 25 | } catch (InterruptedException ignored) { 26 | } 27 | return "data from network server"; 28 | } 29 | }); 30 | Intent intent = new Intent(this, PreLoadBeforeLaunchActivity.class); 31 | intent.putExtra("preLoaderId", preLoaderId); 32 | startActivity(intent); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /DataLoader/apps/app/src/main/java/com/jeremyliao/dataloader/app/PreLoadBeforeLaunchActivity.java: -------------------------------------------------------------------------------- 1 | package com.jeremyliao.dataloader.app; 2 | 3 | import android.os.Bundle; 4 | import android.support.v7.app.AppCompatActivity; 5 | import android.widget.TextView; 6 | 7 | import com.jeremyliao.dataloader.DataLoader; 8 | import com.jeremyliao.dataloader.interfaces.LoadListener; 9 | 10 | public class PreLoadBeforeLaunchActivity extends AppCompatActivity { 11 | 12 | TextView tvShow; 13 | 14 | @Override 15 | protected void onCreate(Bundle savedInstanceState) { 16 | super.onCreate(savedInstanceState); 17 | setContentView(R.layout.activity_preload); 18 | tvShow = findViewById(R.id.tv_show); 19 | int id = getIntent().getIntExtra("preLoaderId", -1); 20 | DataLoader.listen(id, this, new LoadListener() { 21 | @Override 22 | public void onDataArrived(String data) { 23 | tvShow.setText(data); 24 | } 25 | }); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /DataLoader/apps/app/src/main/java/com/jeremyliao/dataloader/app/TestActivity.java: -------------------------------------------------------------------------------- 1 | package com.jeremyliao.dataloader.app; 2 | 3 | import android.os.Bundle; 4 | import android.support.v7.app.AppCompatActivity; 5 | 6 | public class TestActivity extends AppCompatActivity { 7 | 8 | @Override 9 | protected void onCreate(Bundle savedInstanceState) { 10 | super.onCreate(savedInstanceState); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /DataLoader/apps/app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | 13 | 19 | 22 | 25 | 26 | 27 | 28 | 34 | 35 | -------------------------------------------------------------------------------- /DataLoader/apps/app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /DataLoader/apps/app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 |