-
Notifications
You must be signed in to change notification settings - Fork 20
Expand file tree
/
Copy pathDataLoadingModel.java
More file actions
156 lines (132 loc) · 4.78 KB
/
Copy pathDataLoadingModel.java
File metadata and controls
156 lines (132 loc) · 4.78 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
package ru.yandex.yamblz.artists;
import android.database.Observable;
import android.os.AsyncTask;
import android.util.Log;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import ru.yandex.yamblz.artists.utils.DataSingleton;
/*модель для асинхронной загрузки данных.
Можно подписатся на события:начала загрузки,ошибки,успеха
//при добавление слушателя,если данные сенйчас грузятся,
у слушателя вызавется onLoadingStart
*/
public class DataLoadingModel {
private static final String TAG = "DataLoadingModel";
private final DataLoadingObservable mObservable = new DataLoadingObservable();
private LoadAsyncTask loadingTask;
private boolean isWorking;
public DataLoadingModel() {
}
public void loadData() {
if (isWorking) {
return;
}
mObservable.notifyStarted();
isWorking = true;
loadingTask = new LoadAsyncTask();
loadingTask.execute();
}
public void stopLoadData() {
if (isWorking) {
loadingTask.cancel(true);
isWorking = false;
}
}
public void registerObserver(final Observer observer) {
mObservable.registerObserver(observer);
if (isWorking) {
observer.onLoadingStart(this);
}
}
public void unregisterObserver(final Observer observer) {
mObservable.unregisterObserver(observer);
}
public interface Observer {
void onLoadingStart(DataLoadingModel signInModel);
void onLoadingSucceeded(DataLoadingModel signInModel);
void onLoadingFailed(DataLoadingModel signInModel);
}
private class DataLoadingObservable extends Observable<Observer> {
public void notifyStarted() {
for (final Observer observer : mObservers) {
observer.onLoadingStart(DataLoadingModel.this);
}
}
public void notifySucceeded() {
for (final Observer observer : mObservers) {
observer.onLoadingSucceeded(DataLoadingModel.this);
}
}
public void notifyFailed() {
for (final Observer observer : mObservers) {
observer.onLoadingFailed(DataLoadingModel.this);
}
}
}
private class LoadAsyncTask extends AsyncTask<Void, Void, Boolean> {
protected String loadArtistsFromWeb() {
URL url = null;
BufferedReader reader = null;
String result=null;
try {
url = new URL("http://download.cdn.yandex.net/mobilization-2016/artists.json");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.connect();
InputStream inputStream = urlConnection.getInputStream();
StringBuilder buffer = new StringBuilder();
reader = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = reader.readLine()) != null) {
buffer.append(line);
}
result=buffer.toString();
} catch (IOException e) {
e.printStackTrace();
}
finally {
if(reader!=null) try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
}
protected boolean readArtistJson() {
if (DataSingleton.get().hasData()) {
Log.i(TAG, "already loaded");
return true;
} else {
String jsonString = loadArtistsFromWeb();
if (jsonString == null) {
Log.i(TAG, "failed to load data");
return false;
} else {
DataSingleton.get().setData(jsonString);
return true;
}
}
}
@Override
protected Boolean doInBackground(Void... voids) {
return readArtistJson();
}
@Override
protected void onPostExecute(Boolean success) {
super.onPostExecute(success);
isWorking = false;
if (success) {
Log.i(TAG,"successfully get data");
mObservable.notifySucceeded();
} else {
Log.i(TAG,"error while get data");
mObservable.notifyFailed();
}
}
}
}