Skip to content

Commit 3c9cee0

Browse files
author
jelic98
committed
Asynchronous layout fetching
1 parent 343c0c1 commit 3c9cee0

File tree

5 files changed

+81
-10
lines changed

5 files changed

+81
-10
lines changed

README.md

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,12 @@ setListener(new LayoutStateListener() {
110110
setOptions(CACHE_ONLY)
111111
```
112112

113+
* Non-stop layout fetching
114+
115+
```java
116+
setOptions(NON_STOP) // use with setAsyncPause(long millis)
117+
```
118+
113119
## Supported views in 'android.widget'
114120
* EditText
115121
* TextView
@@ -150,7 +156,6 @@ Starts layout fetching from cache/server depending on provided options
150156

151157
## TODO
152158
* Support RelativeLayout
159+
* Add more views
153160
* Support vector drawables
154-
* Add usage details in MANUAL.md
155-
* Add replica of some poplar layout
156-
* Non-stop fetching option
161+
* Add usage details in MANUAL.md + layout replica

app/src/main/java/org/ecloga/dynamico/Dynamico.java

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
package org.ecloga.dynamico;
22

3+
import android.os.Looper;
34
import android.view.ViewGroup;
5+
import java.util.Timer;
6+
import java.util.TimerTask;
47

58
public final class Dynamico {
69

710
private static final String TAG = "Dynamico";
811

12+
private long asyncPause = 30 * 1000;
913
private DynamicoLayoutLoader loader;
1014
private DynamicoOptions options;
1115

@@ -47,16 +51,42 @@ public Dynamico setOptions(DynamicoOptions.Option ... options) {
4751
return this;
4852
}
4953

54+
/**
55+
* Overrides default asyncPause (30 seconds)
56+
* Note: NON_STOP option must be enabled
57+
* @param millis asynchronous call pause in milliseconds
58+
* @return Dynamico object ready for initialization
59+
*/
60+
public Dynamico setAsyncPause(long millis) {
61+
this.asyncPause = millis;
62+
63+
return this;
64+
}
65+
5066
/**
5167
* Starts layout fetching from cache/server depending on provided options
5268
*/
5369
public void initialize() {
5470
Util.log(TAG, "Device information: " + Device.getAllInfo());
71+
Util.log(TAG, "Dynamico options: " + options);
5572

56-
if(options.isEnabled(DynamicoOptions.Option.ONLY_CACHE)) {
57-
loader.loadLayoutFromCache();
58-
}else {
59-
loader.loadLayoutFromServer();
60-
}
73+
new Timer().scheduleAtFixedRate(new TimerTask() {
74+
@Override
75+
public void run() {
76+
if(Looper.myLooper() == null) {
77+
Looper.prepare();
78+
}
79+
80+
if(options.isEnabled(DynamicoOptions.Option.ONLY_CACHE)) {
81+
loader.loadLayoutFromCache();
82+
}else {
83+
loader.loadLayoutFromServer();
84+
}
85+
86+
if(!options.isEnabled(DynamicoOptions.Option.NON_STOP)) {
87+
this.cancel();
88+
}
89+
}
90+
}, 0, asyncPause);
6191
}
6292
}

app/src/main/java/org/ecloga/dynamico/DynamicoLayoutLoader.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package org.ecloga.dynamico;
22

3+
import android.app.Activity;
34
import android.content.Context;
5+
import android.os.Handler;
6+
import android.os.Looper;
47
import android.view.ViewGroup;
58
import org.ecloga.dynamico.network.ApiResponse;
69
import org.ecloga.dynamico.network.FileDownload;
@@ -39,6 +42,8 @@ public void setListener(DynamicoListener listener) {
3942
public void loadLayoutFromServer() {
4043
Util.log(TAG, "Loading from server");
4144

45+
onPreLoad();
46+
4247
new FileDownload(getDirectoryUrl(name), context, getStoragePath(name, context))
4348
.addHandler(new ApiResponse() {
4449
@Override
@@ -63,6 +68,8 @@ public void onError(String message) {
6368
public void loadLayoutFromCache() {
6469
Util.log(TAG, "Loading from cache");
6570

71+
onPreLoad();
72+
6673
File file = new File(getStoragePath(name, context));
6774

6875
try {
@@ -89,6 +96,15 @@ public void loadLayoutFromCache() {
8996
}
9097
}
9198

99+
private void onPreLoad() {
100+
new Handler(Looper.getMainLooper()).post(new Runnable() {
101+
@Override
102+
public void run() {
103+
layout.removeAllViews();
104+
}
105+
});
106+
}
107+
92108
private void addViews(String content) {
93109
ViewFactory factory = new ViewFactory(context);
94110

app/src/main/java/org/ecloga/dynamico/DynamicoOptions.java

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,22 @@
33
import java.util.Arrays;
44
import java.util.EnumSet;
55

6-
class DynamicoOptions {
6+
public class DynamicoOptions {
77

8+
/**
9+
* Options that can be attached to Dynamico object
10+
*/
811
public enum Option {
9-
ONLY_CACHE
12+
/**
13+
* Force checking cache before fetching layout from server
14+
*/
15+
ONLY_CACHE,
16+
17+
/**
18+
* Fetch layout constantly
19+
* Note: Pause between server requests is 30 seconds or use setAsyncPause(long millis)
20+
*/
21+
NON_STOP
1022
}
1123

1224
private EnumSet<Option> options;
@@ -19,4 +31,9 @@ public enum Option {
1931
public boolean isEnabled(Option option) {
2032
return options.contains(option);
2133
}
34+
35+
@Override
36+
public String toString() {
37+
return super.toString();
38+
}
2239
}

demo/src/main/java/org/ecloga/demo/ActivityMain.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.ecloga.dynamico.Dynamico;
1010
import org.ecloga.dynamico.DynamicoException;
1111
import org.ecloga.dynamico.DynamicoListener;
12+
import org.ecloga.dynamico.DynamicoOptions;
1213

1314
public class ActivityMain extends AppCompatActivity {
1415

@@ -30,6 +31,8 @@ public void onError(String message) {
3031
// notify user
3132
}
3233
})
34+
.setOptions(DynamicoOptions.Option.NON_STOP)
35+
.setAsyncPause(5000)
3336
.initialize();
3437
}catch(DynamicoException e) {
3538
finish();

0 commit comments

Comments
 (0)