-
Notifications
You must be signed in to change notification settings - Fork 2
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 abacus-util 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 abacus-util 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 abacus-util. 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