-
Notifications
You must be signed in to change notification settings - Fork 10
Programming in Android
Below features are supported for Android.
-
Most daily used APIs: Pair, Triple, Tuple, Multiset, BiMap, Multimap, ImmutableList, ImmutableSet, ImmutableMap, Splitter, Joiner, Builder, Difference, IOUtil, N ...
-
A JSON Parser: Easy to learn, simple to use, two times faster than Gson and more powerful.
-
The simplest synchronous/asynchronous HTTP client: HttpClient and OKHttpClient
-
Agile Restful Web service development: HttpProxy, which is similar with Retrofit and even simpler.
-
Most convenient utility for SQLite: SQLiteExecutor and SQLBuilder. No configuration/Annotation
-
Stream + AsyncExecutor + CompletableFuture + Futures with Lambdas supported by Retrolambda -> RxJava
The coming version Android studio is going to support Java 8 features. The Stream API provided in AbacusUtil mostly is consistent with the Stream API in JDK 8. It's very easy to replace with each other. The implementation of Stream API in AbacusUtil is pretty straight forward. In a lot of scenarios, it's even faster than the implementation in JDK 8. Besides int, long, double, other primitive types: boolean, char, byte, short, float are also supported by the Stream API in AbacusUtil. Additionally, a lot of methods(e.g. forEach, filter...) in N are also designed to support functional programming...Enjoying Note: I tested on Android Studio 2.1 RC. and found couple of issues: 1), Instant run is not supported. 2), slow, 3), unable to show the variable value in debug. So maybe it's better to stay with Retrolambda before new Java 8 features become stable.
- Switch smoothly between UI and background threads by the fluent execute/callback APIs in CompletableFuture
TPExecutor.execute(() -> {
return accountService.createAccount(signUpRequest);
}).thenRunOnUI((signUpResp, signUpError) -> {
signInButton.setText("SIGN UP");
ProgressBarTask.finish();
if (Fu.check(signUpResp)) {
final LoginRequest signInRequest = new LoginRequest().setAccessToken(accessToken).setLoginId(signUpRequest.getEmailAddress())
.setLoginPassword(signUpRequest.getPassword());
TPExecutor.execute(() -> {
return accountService.login(signInRequest);
}).thenRunOnUI((signInResp, signInError) -> {
if (Fu.check(signInResp)) {
final Account account = signInResp.getAccount();
Settings.setUserId(account.getId());
Settings.setUserName(account.getFullName());
Settings.setRWSUserAccessToken(signInResp.getUserAccessToken());
final Intent intent = new Intent();
intent.putExtra(Fu.USER_ACCESS_TOKEN, signInResp.getUserAccessToken());
setResult(RESULT_OK, intent);
} else {
startActivity(new Intent(this, SignInActivity.class));
}
finish();
});
} else {
if (signUpResp != null) {
if (signUpResp.getRespCode() == ResponseCode.LOGIN_ID_NOT_AVAILABLE) {
Fu.showToast("Email address: " + email + " has been used. Please try with another one or go to sign in page to login " +
"directly");
} else {
Fu.showToast("Unable to create account due to", signUpResp);
}
} else {
Fu.showToast("Unable to create account due to network or system error.");
}
}
});
- How to Learn/Use the APIs correctly and efficiently
- Programming in RDBMS with Jdbc/PreparedQuery/SQLExecutor/Mapper/Dao
- JSON/XML Parser
- SQLite Executor
- SQL Executor
- SQL Builder
- SQL Mapper
- DataSet
- JdbcUtil/CSVUtil
- IOUtil
- PrimitiveList
- Profiler
- Http Client
- Web Services
- Programming in Android
- Parse/Analyze/Operate (Big) Data (on N servers in parallel)
- Code Generation
- Introduction to JDBC
- Naming Convention
- Partitioning/Distribution
- SQL/NoSQL
- Model/Entity