Post on 30-Dec-2016
transcript
Android tipswhich simplify your life
Android Studio
● beta● gradle build system● maven-based build dependencies● build variants● code completion, refactoring, templates● graphical template editor
Gradleapply plugin: 'com.android.application'
android {
compileSdkVersion 20
buildToolsVersion "20.0.0"
...
Gradle… defaultConfig {
applicationId "ee.ut.cs.mobile.demo"
minSdkVersion 14
targetSdkVersion 20
versionCode 1
versionName "1.0"
}
Gradle...
buildTypes {
release {
runProguard false
proguardFiles 'proguard-rules.pro'
}
}
}
Gradle...
buildTypes {
...
debug {
applicationIdSuffix '.debug'
}
}
}
Gradle…
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.google.code.gson:gson:2.3'
}
Gradleandroid { .... productFlavors { cs { applicationId "ee.ut.cs"
} eco { applicationId "ee.ut.eco"
} }}
Gradlehttps://developer.android.com/sdk/installing/studio.htmlhttp://tools.android.com/tech-docs/new-build-system/user-guidehttp://gradleplease.appspot.com/
Butter Knife
● view injection● simplify fragments, adapters
http://jakewharton.github.io/butterknife/
Butter KnifeTextView mainTextView;
...
mainTextView = (TextView) rootView.findViewById(R.id.mainTextView);
@InjectView(R.id.mainTextView) TextView mainTextView;
…public View onCreateView(...) {
View rootView = inflater.inflate(R.layout.fragment_main, ...);
ButterKnife.inject(this, rootView);
}
Butter KnifemainButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getActivity(), "Hi", Toast.LENGTH_SHORT).show();
}
});
@OnClick(R.id.mainButton)
public void submit() {
Toast.makeText(getActivity(), "Hi", Toast.LENGTH_SHORT).show();
}
GSON
● java object to json● json to java object
https://code.google.com/p/google-gson/
User myUser = new User("Lars");
Gson gson = new Gson();
String userJson = gson.toJson(myUser);
Retrofit
http://square.github.io/retrofit/
Retrofit turns your REST API into a Java interface.
Retrofit - Step 1: POJOcurl -i https://api.github.com/users/octocat
{
"login": "octocat",
"id": 583231,
"avatar_url": "https://avatars.githubusercontent.com/u/583231?v=2",
"type": "User",
"name": "The Octocat",
"company": "GitHub",
"location": "San Francisco",
"email": "octocat@github.com",
...
}
Retrofit - Step 1: POJOpublic class GitHubUser {
private String login;
private String id;
private String name;
private String location;
private String email;
@SerializedName("avatar_url")
private String avatarUrl;
public GitHubUser(){}
}
Retrofit - Step 2: Service Interfacepublic interface GitHubService {
public static String API_URL = "https://api.github.com"
@GET("/users/{user}/repos")
List<Repository> listRepos(@Path("user") String user);}
Retrofit - Step 3: Rest ClientRestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint(GitHubService.API_URL)
.build();
GitHubService service = restAdapter.create(GitHubService.class);
List<Repository> repos = service.listRepos("octocat");
Retrofit - Sync or Async?
...
List<Repository> repos = service.listRepos("octocat");
NetworkOnMainThreadException!
Retrofit - Sync or Async?
public interface GitHubService {
public static String API_URL = "https://api.github.com"
@GET("/users/{user}/repos")
void listReposAsync(@Path("user") String user,
Callback<List<Repository>> cb);
}
Retrofit - Sync or Async?
GitHubService service = restAdapter.create(GitHubService.class);
service.listReposAsync("octocat", new Callback<List<Repository>>() {
@Override
public void success(List<Repository> repositories,
Response response) {
}
@Override
public void failure(RetrofitError error) {
}
});
RetrofitRestAdapter.Builder builder = new RestAdapter.Builder();
builder.setEndpoint(GitHubService.API_URL);
if (BuildConfig.DEBUG) {
builder.setLogLevel(RestAdapter.LogLevel.FULL);
}
RestAdapter restAdapter = builder.build();
Networking - DefaultHttpClientHttpClient client = new DefaultHttpClient();HttpGet request = new HttpGet("http://www.fortumo.com");HttpResponse response = client.execute(request);
BufferedReader rd = new BufferedReader (new InputStreamReader(response.getEntity().getContent())); String line = "";while ((line = rd.readLine()) != null) { textView.append(line);}
Networking - OkHttp
● efficient http client by default● spdy, connection pooling, ...
http://square.github.io/okhttp/
Networking - OkHttpOkHttpClient client = new OkHttpClient();Request request = new Request.Builder() .url("http://www.fortumo.com") .build();
Response response = client.newCall(request).execute();textView.setText(response.body().string());
OkHttp + RetrofitOkHttpClient okHttpClient = new OkHttpClient();
RestAdapter.Builder builder = new RestAdapter.Builder();
builder.setEndpoint(GitHubService.API_URL);builder.setClient(new OkClient(okHttpClient));
RestAdapter restAdapter = builder.build();
Universal Image Loader● load, cache and display images easily● lots of configuration options ● good control over the image loading and caching process
https://github.com/nostra13/Android-Universal-Image-Loader
Universal Image Loader<manifest>
<!-- if you load images from Internet -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- if you want to cache images on SD card -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
/>
...
</manifest>
Universal Image LoaderImageLoaderConfiguration config =
new ImageLoaderConfiguration.Builder(this)
… .build();
ImageLoader.getInstance().init(config);
global for the application!
Universal Image Loader@OnClick(R.id.secondButton)
public void getUserInfo() {
getService().getUserInfo("octocat", new Callback<GitHubUser>() {
@Override
public void success(GitHubUser gitHubUser, Response response) {
ImageLoader.getInstance()
.displayImage(gitHubUser.getAvatarImageUrl(), avatarImageView);
}
});
}
Exercisehttps://developer.github.com/v3/
git clone git@bitbucket.org:lars_eckart/ut-exercise.git