Handle response of WorkManager on Network connection Failure

Usman Rana

I'm using WorkManager to sync data from my local Room database to server. The issue is that Room gives error to build database in Loop.MainLooper() and when i use it as following it works fine. But I'm unable to return the 'WorkerResult' on SUCCESS or RETRY based upon task completion. How to stop worker when Netwrok is lost?

public class TestSyncManager extends Worker {

    private final WorkerResult[] workerResult = {WorkerResult.SUCCESS};
    // @Inject            // Dagger2 has not added the support for dependency injection in worker yet.
    private ApiHeader mApiHeader;
    private HandlerThread mHandlerThread;
    private Handler mHandler;
    private Runnable mRunnable;
    private DataManager dataManager;

    @NonNull
    @Override
    public WorkerResult doWork() {
        try {
            //Looper.prepare();
                CommonUtils.Log("usm_work_manager_1", "Work is Started.");

                try {
                    checkNextCall();
                } catch (Exception e) {
                    e.printStackTrace();
                    setWorkerResult(WorkerResult.FAILURE);
                }
            };
            //mHandler = new Handler(Looper.myLooper());
            mHandlerThread = new HandlerThread("LikesHandlerThread");
            mHandlerThread.start();

            Looper looper = mHandlerThread.getLooper();
            mHandler = new Handler(looper);
            mHandler.post(mRunnable);
            //Looper.loop();


            return workerResult[0];
        } catch (Exception e) {
            e.printStackTrace();
            setWorkerResult(WorkerResult.FAILURE);
            return workerResult[0];
        }
    }

    private void checkNextCall() {
        List<LikeAction> likeActions = dataManager.getPendingLikeActions();
        CommonUtils.Log("usm_like_actions", "count= " + likeActions.size());
        if (likeActions.size() > 0) {
            LikeAction likeAction = likeActions.get(0);
            if (NetworkUtils.isNetworkConnected(getApplicationContext())) {
                dataManager.updateProcessingStatus(ActionType.LIKE_ACTION, likeAction.postId);
                requestLikesSync(likeAction);
            } else
                setWorkerResult(WorkerResult.RETRY);
        } else {
            setWorkerResult(WorkerResult.SUCCESS);
        }

    }

    @SuppressLint("CheckResult")
    private void requestLikesSync(LikeAction likeAction) {

                   /* int[] postIds = new int[likeActions.size()];
            for (int i = 0; i < likeActions.size(); i++) {
                postIds[i] = likeActions.get(i).postId;
            }*/
        LikeActionRemote.Request requestObj = new LikeActionRemote.Request(likeAction);

        String apiUrl = ApiEndPoint.BASE_URL + ApiEndPoint.LIKE_ACTION;

        try {
            LikeActionRemote.Response response = dataManager.doLikeActionApiCall(apiUrl, requestObj).blockingGet();
            Log.d("usm_response", "data= " + new Gson().toJson(response));
            if (response.isSuccess())
                dataManager.deleteProcessedActionById(ActionType.LIKE_ACTION, likeAction.postId);

            checkNextCall();
        } catch (Exception e) {
            e.printStackTrace();
        }
        CommonUtils.Log("usm_worker_network", "isNetworkConnected= " + NetworkUtils.isNetworkConnected(getApplicationContext()));
    }

    /**
     * This function will set the result of Worker and
     * it will clear Handler and will quit looper to let
     * the thread exit.
     *
     * @param result WorkResult (Success,Retry or Failure)
     */
    private void setWorkerResult(WorkerResult result) {

        workerResult[0] = result;
        if (mHandlerThread != null) {
            mHandlerThread.getLooper().quit();
            mHandlerThread.getLooper().getThread().interrupt();
            mHandlerThread = null;
            mHandler.getLooper().quit();
            mHandler.removeCallbacks(mRunnable);
            mHandler = null;
        }
    }
}
Lukas

instead of .subscribe use .blockingFirst() operator. If your api call fails, workManger will retry your request:

...
try{
    Response response = dataManager.doLikeActionApiCall(API.URL, requestObj).blockingFirst();
    if(response.isSuccess()){
        return WorkerResult.SUCCESS;
    }else{
        return WorkerResult.RETRY;
    }
}catch (NoSuchElementException|NullPointerException c){
        return WorkerResult.RETRY;       
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

golang : network response from ioutil.ReadAll() is empty, connection reset by peer

分類Dev

Handle network interruption in WebRTC

分類Dev

WorkManager: how is network constraint handled when AlarmManager is used?

分類Dev

Network/Socket Connection Issue

分類Dev

How to handle UniqueConstraint failure in Django Meta Class?

分類Dev

How to handle SSL handshake failure in Netty

分類Dev

Network connection problem in react native

分類Dev

LTE network connection with USB stick

分類Dev

How does Spark handle failure scenarios involving JDBC data source?

分類Dev

How to handle 404 as json response if route not found?

分類Dev

How to create and handle response for Ajax call

分類Dev

Handle network changes on android 7 Nougat

分類Dev

disabling hyper-v in windows 10 causes complete network failure

分類Dev

network.service ExecStartPre =(code = exited、status = 1 / FAILURE)

分類Dev

HTTP Response Connection Keep Alive is dropped

分類Dev

How to remove Internet Connection Sharing from a Network Connection?

分類Dev

Setting dns-nameservers on a Bonded Network Connection

分類Dev

How to launch a command on network connection/disconnection?

分類Dev

Connection of Android to Windows 7 using Hosted Network

分類Dev

Using two network connection types on Windows 7

分類Dev

SSH Network Error: Software caused connection abort

分類Dev

Add a connection to KDE's Network Connections

分類Dev

Connection to SSH from external network refused

分類Dev

maximum number of NIC(Network Interface Controller) connection?

分類Dev

JBoss7 remote MDB connection to JMS queue -Connection failure has been detected

分類Dev

React Native handle socket connection's events when app is in background?

分類Dev

ServiceStack OrmLite - Elegant way to handle SQL Server Connection Drops

分類Dev

node-amqp — proper way to handle connection in Express app?

分類Dev

How to handle connection pooling with c3p0

Related 関連記事

  1. 1

    golang : network response from ioutil.ReadAll() is empty, connection reset by peer

  2. 2

    Handle network interruption in WebRTC

  3. 3

    WorkManager: how is network constraint handled when AlarmManager is used?

  4. 4

    Network/Socket Connection Issue

  5. 5

    How to handle UniqueConstraint failure in Django Meta Class?

  6. 6

    How to handle SSL handshake failure in Netty

  7. 7

    Network connection problem in react native

  8. 8

    LTE network connection with USB stick

  9. 9

    How does Spark handle failure scenarios involving JDBC data source?

  10. 10

    How to handle 404 as json response if route not found?

  11. 11

    How to create and handle response for Ajax call

  12. 12

    Handle network changes on android 7 Nougat

  13. 13

    disabling hyper-v in windows 10 causes complete network failure

  14. 14

    network.service ExecStartPre =(code = exited、status = 1 / FAILURE)

  15. 15

    HTTP Response Connection Keep Alive is dropped

  16. 16

    How to remove Internet Connection Sharing from a Network Connection?

  17. 17

    Setting dns-nameservers on a Bonded Network Connection

  18. 18

    How to launch a command on network connection/disconnection?

  19. 19

    Connection of Android to Windows 7 using Hosted Network

  20. 20

    Using two network connection types on Windows 7

  21. 21

    SSH Network Error: Software caused connection abort

  22. 22

    Add a connection to KDE's Network Connections

  23. 23

    Connection to SSH from external network refused

  24. 24

    maximum number of NIC(Network Interface Controller) connection?

  25. 25

    JBoss7 remote MDB connection to JMS queue -Connection failure has been detected

  26. 26

    React Native handle socket connection's events when app is in background?

  27. 27

    ServiceStack OrmLite - Elegant way to handle SQL Server Connection Drops

  28. 28

    node-amqp — proper way to handle connection in Express app?

  29. 29

    How to handle connection pooling with c3p0

ホットタグ

アーカイブ