Skip to content

Commit 91c53fe

Browse files
authored
Merge pull request #197 from spoonconsulting/fix-executor-service
Out of Memory Crash: executorService
2 parents eb1e98f + d73f293 commit 91c53fe

File tree

8 files changed

+43
-18
lines changed

8 files changed

+43
-18
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
## [4.0.1](https://github.com/spoonconsulting/cordova-plugin-background-upload/compare/4.0.0...4.0.1) (2022-03-04)
2+
* **android:** Fixed number of Threads for Executor Service and update Room
3+
14
## [4.0.0](https://github.com/spoonconsulting/cordova-plugin-background-upload/compare/2.0.7...4.0.0) (2022-03-04)
25
* **android:** Added WorkManager to handle uploads
36

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# cordova-plugin-background-upload
33
This plugin provides a file upload functionality that can continue to run even while the app is in background. It includes progress updates suitable for long-term transfer operations of large files.
44

5-
[![npm version](https://badge.fury.io/js/cordova-plugin-background-upload.svg)](https://badge.fury.io/js/cordova-plugin-background-upload)
5+
[![npm version](https://badge.fury.io/js/@spoonconsulting%2Fcordova-plugin-background-upload.svg)](https://badge.fury.io/js/@spoonconsulting%2Fcordova-plugin-background-upload)
66
[![Build Status](https://travis-ci.com/spoonconsulting/cordova-plugin-background-upload.svg?branch=master)](https://travis-ci.org/spoonconsulting/cordova-plugin-background-upload)
77

88
**Supported Platforms**

package-lock.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@spoonconsulting/cordova-plugin-background-upload",
3-
"version": "4.0.0",
3+
"version": "4.0.1",
44
"description": "Cordova plugin for uploading file in the background",
55
"cordova": {
66
"id": "@spoonconsulting/cordova-plugin-background-upload",

plugin.xml

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<?xml version="1.0" encoding="UTF-8"?>
2-
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0" xmlns:android="http://schemas.android.com/apk/res/android" id="@spoonconsulting/cordova-plugin-background-upload" version="4.0.0">
2+
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0" xmlns:android="http://schemas.android.com/apk/res/android" id="@spoonconsulting/cordova-plugin-background-upload" version="4.0.1">
33
<name>Cordova Background Upload Plugin</name>
44
<description>Background Upload plugin for Cordova</description>
55
<license>ISC</license>
@@ -15,11 +15,9 @@
1515
<dependency id="cordova-plugin-androidx-adapter" version="1.1.0"/>
1616
<dependency id="cordova-plugin-file" version="6.0.2"/>
1717
<platform name="android">
18-
<framework src="com.sromku:simple-storage:1.2.0" />
1918
<framework src="androidx.work:work-runtime:2.7.1" />
20-
<framework src="io.reactivex.rxjava3:rxjava:3.0.13" />
2119
<framework src="com.squareup.okhttp3:okhttp:4.9.0" />
22-
<framework src="androidx.room:room-runtime:2.3.0" />
20+
<framework src="androidx.room:room-runtime:2.4.2" />
2321
<framework src="src/android/config.gradle" custom="true" type="gradleReference"/>
2422
<config-file target="res/xml/config.xml" parent="/*">
2523
<feature name="FileTransferBackground">

src/android/AckDatabase.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,11 @@ public static AckDatabase getInstance(final Context context) {
2323
return instance;
2424
}
2525

26+
public static void closeInstance() {
27+
// not called for now
28+
instance.close();
29+
instance = null;
30+
}
31+
2632
public abstract UploadEventDao uploadEventDao();
2733
}

src/android/FileTransferBackground.java

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import androidx.work.ExistingWorkPolicy;
1515
import androidx.work.NetworkType;
1616
import androidx.work.OneTimeWorkRequest;
17+
import androidx.work.OutOfQuotaPolicy;
1718
import androidx.work.WorkInfo;
1819
import androidx.work.WorkManager;
1920
import androidx.work.WorkQuery;
@@ -37,6 +38,8 @@
3738
import java.util.Map;
3839
import java.util.UUID;
3940
import java.util.concurrent.ExecutionException;
41+
import java.util.concurrent.Executors;
42+
import java.util.concurrent.ScheduledExecutorService;
4043
import java.util.concurrent.TimeUnit;
4144

4245
public class FileTransferBackground extends CordovaPlugin {
@@ -52,6 +55,8 @@ public class FileTransferBackground extends CordovaPlugin {
5255
private static String currentTag;
5356
private static long currentTagFetchedAt;
5457

58+
private ScheduledExecutorService executorService = null;
59+
5560
public void sendCallback(JSONObject obj) {
5661
/* we check the webview has been initialized */
5762
if (ready) {
@@ -116,7 +121,11 @@ private void sendError(final String id, final String reason, boolean userCancele
116121

117122
@Override
118123
public boolean execute(String action, JSONArray args, final CallbackContext callbackContext) {
119-
cordova.getThreadPool().execute(() -> {
124+
if(executorService == null) {
125+
executorService = Executors.newScheduledThreadPool(4);
126+
}
127+
128+
executorService.schedule(() -> {
120129
try {
121130
switch (action) {
122131
case "initManager":
@@ -142,7 +151,7 @@ public boolean execute(String action, JSONArray args, final CallbackContext call
142151
callbackContext.sendPluginResult(result);
143152
exception.printStackTrace();
144153
}
145-
});
154+
} , 0, TimeUnit.MILLISECONDS);
146155

147156
return true;
148157
}
@@ -181,8 +190,12 @@ private void initManager(String options, final CallbackContext callbackContext)
181190
.uploadEventDao()
182191
.getAll();
183192

193+
int ackDelay = 0;
184194
for (UploadEvent ack : uploadEvents) {
185-
handleAck(ack.getOutputData());
195+
executorService.schedule(() -> {
196+
handleAck(ack.getOutputData());
197+
}, ackDelay, TimeUnit.MILLISECONDS);
198+
ackDelay += 200;
186199
}
187200

188201
// Can't use observeForever anywhere else than the main thread
@@ -208,15 +221,15 @@ private void initManager(String options, final CallbackContext callbackContext)
208221
case BLOCKED:
209222
case ENQUEUED:
210223
case SUCCEEDED:
211-
completedTasks = completedTasks + 1;
224+
completedTasks++;
212225
// No db in main thread
213-
cordova.getThreadPool().execute(() -> {
226+
executorService.schedule(() -> {
214227
// The corresponding ACK is already in the DB, if it not, the task is just a leftover
215228
String id = info.getOutputData().getString(UploadTask.KEY_OUTPUT_ID);
216229
if (ackDatabase.uploadEventDao().exists(id)) {
217230
handleAck(info.getOutputData());
218231
}
219-
});
232+
}, 0, TimeUnit.MILLISECONDS);
220233
break;
221234
case FAILED:
222235
// The task can't fail completely so something really bad has happened.
@@ -319,7 +332,7 @@ private void addUpload(JSONObject jsonPayload) {
319332
private void startUpload(final String uploadId, final Data payload) {
320333
Log.d(TAG, "startUpload: Starting work via work manager");
321334

322-
OneTimeWorkRequest workRequest = new OneTimeWorkRequest.Builder(UploadTask.class)
335+
OneTimeWorkRequest.Builder workRequestBuilder = new OneTimeWorkRequest.Builder(UploadTask.class)
323336
.setConstraints(new Constraints.Builder()
324337
.setRequiredNetworkType(NetworkType.CONNECTED)
325338
.build()
@@ -328,8 +341,13 @@ private void startUpload(final String uploadId, final Data payload) {
328341
.setBackoffCriteria(BackoffPolicy.LINEAR, 30, TimeUnit.SECONDS)
329342
.addTag(FileTransferBackground.WORK_TAG_UPLOAD)
330343
.addTag(getCurrentTag(cordova.getContext()))
331-
.setInputData(payload)
332-
.build();
344+
.setInputData(payload);
345+
346+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
347+
workRequestBuilder.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST);
348+
}
349+
350+
OneTimeWorkRequest workRequest = workRequestBuilder.build();
333351

334352
WorkManager.getInstance(cordova.getContext())
335353
.enqueueUniqueWork(uploadId, ExistingWorkPolicy.APPEND, workRequest);
@@ -365,7 +383,7 @@ private void removeUpload(String uploadId, CallbackContext context) {
365383
PluginResult result = new PluginResult(PluginResult.Status.OK);
366384
result.setKeepCallback(true);
367385
context.sendPluginResult(result);
368-
}, cordova.getThreadPool());
386+
}, executorService);
369387
}
370388

371389
private void acknowledgeEvent(String eventId, CallbackContext context) {

src/android/UploadTask.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ public Result doWork() {
206206
try {
207207
response = currentCall.execute();
208208
} catch (SocketTimeoutException e) {
209-
e.printStackTrace();
209+
return Result.retry();
210210
} finally {
211211
concurrentUploads.release();
212212
}

0 commit comments

Comments
 (0)