服务中的异步任务在第二次运行时为付款连接器返回 null

Async Task in Service Returning Null For Payment Connector on Second Run

提问人:z123 提问时间:6/13/2023 更新时间:6/13/2023 访问量:14

问:

我是 android 的新手,遇到了一个我不清楚的问题。我已经坚持了一段时间,似乎没有研究帮助,所以想尝试发帖。我有一个android java应用程序,在该应用程序中,我有一个intentService,它有一个执行的AsyncTask。我遇到的问题是,一旦我运行了一次意图,它就可以正常工作,但是第二次通过doInBackground()方法运行代码时,付款连接器和订单连接器返回null。我知道我做错了什么,但找不到在哪里,如果我将 ASYNC 任务逻辑移动到 intentService 类中,付款侦听器就会停止工作。

我的支付连接器服务类:

package com.drivensoftware.cloverServerAssistant;

import android.accounts.Account;
import android.app.IntentService;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Binder;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import android.widget.Toast;

import com.clover.connector.sdk.v3.PaymentConnector;
import com.clover.sdk.Lockscreen;
import com.clover.sdk.util.CloverAccount;
import com.clover.sdk.v1.BindingException;
import com.clover.sdk.v1.ClientException;
import com.clover.sdk.v1.ServiceException;
import com.clover.sdk.v3.connector.ExternalIdUtils;
import com.clover.sdk.v3.connector.IDeviceConnectorListener;
import com.clover.sdk.v3.connector.IPaymentConnectorListener;
import com.clover.sdk.v3.order.Order;
import com.clover.sdk.v3.order.OrderConnector;
import com.clover.sdk.v3.remotepay.SaleRequest;

import org.jetbrains.annotations.Nullable;

import java.util.ArrayList;

public class PaymentConnectorService extends IntentService {
    private Account account;
    private PaymentConnector paymentConnector;
    private OrderConnector orderConnector;
    private AsyncTask waitingTask;
    private ArrayList<IDeviceConnectorListener> listeners = new ArrayList<>();

    public PaymentConnectorService() {
        super("PaymentConnectorService");
    }

    @Override
    public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
        if (account == null) {
            account = CloverAccount.getAccount(this);

            if (account == null) {
                Toast.makeText(this, "there is no account", Toast.LENGTH_SHORT).show();
            }
        }

        return super.onStartCommand(intent, flags, startId);
    }

    private void connect(IPaymentConnectorListener cloverPaymentListener){
        disconnect();
        if (account != null) {
            Log.i("connect()", "Account found: connecting services");
            orderConnector = new OrderConnector(this, account, null);
            orderConnector.connect();
            initializePaymentConnector(cloverPaymentListener);
        }
        Log.i("connect()", "Done connecting!");
    }

    private void disconnect(){
        Log.i("disconnect()", "Disconnecting services!");
        if (orderConnector != null) {
            orderConnector.disconnect();
            orderConnector = null;
        }
        if (paymentConnector != null) {
            paymentConnector.dispose();
            paymentConnector = null;
        }

        Log.i("disconnect()", "Done disconnecting!");
    }

    public void addCloverConnectorListener(IDeviceConnectorListener listener) {
        if (!listeners.contains(listener)) {
            listeners.add(listener);
        }
    }


    private void initializePaymentConnector(IPaymentConnectorListener ccListener) {
        if (account == null) {
            account = CloverAccount.getAccount(this);

            if (account == null) {
                Toast.makeText(this, "there is no account", Toast.LENGTH_SHORT).show();
            }
        }
        if (paymentConnector == null) {
            // Set your RAID as the remoteApplicationId
            String remoteApplicationId = "SWDEFOTWBD7XT.6W3D67YDX8GN3";
            paymentConnector =  new PaymentConnector(this, account, ccListener, remoteApplicationId);
            paymentConnector.initializeConnection();
        }
    }


    @Override
    protected void onHandleIntent(Intent intent) {
        Log.i("printOrderService", "onHandleIntent: " + intent.getStringExtra("orderId"));
        Toast.makeText(getApplicationContext(), "New Order Received!", Toast.LENGTH_LONG).show();
        new SpecificOrderAsyncTask().execute(intent.getStringExtra("orderId"));

    }

    public class SpecificOrderAsyncTask extends AsyncTask<String, Void, Order> {
        final IPaymentConnectorListener ccListener = new PaymentConnectorListener(PaymentConnectorService.this);

        @Override
        protected final Order doInBackground(String... currentOrderID) {
            Order newOrder;
            try {
                connect(ccListener);
                String orderId = currentOrderID[0];
                newOrder = orderConnector.getOrder(orderId);
                Log.i("SpecificOrderAsyncTask", "Order found: returning");
                if (newOrder !=null){
                    Log.i("printOrderService", "onHandleIntent: Order found");
                    int retry = 0;
                    while (retry < 5) {
                        SaleRequest saleRequest = new SaleRequest();
                        saleRequest.setOrderId(newOrder.getId());
                        saleRequest.setExternalId(ExternalIdUtils.generateNewID()); //required, but can be any string
                        saleRequest.setAmount(newOrder.getTotal());
                        Lockscreen lockscreen = new Lockscreen(PaymentConnectorService.this);
                        lockscreen.unlock();
                        paymentConnector.sale(saleRequest);

                        retry = 5;
                    }
                    //new StaticOrderPrintJob.Builder().order(newOrder).build().print(getApplicationContext(), account);
                } else{
                    Log.i("PaymentConnectorService", "onHandleIntent: Order not found, print not triggered.");
                }
                return newOrder;
            } catch (RemoteException | ClientException | ServiceException | BindingException e) {
                e.printStackTrace();
            } finally{
                Log.i("PaymentConnectorService", "onHandleIntent: Attempted to retrieve order");
            }
            return null;
        }

        @Override
        protected void onPostExecute(Order order){
            System.out.println("ORDER " +order);
        }

        @Override
        protected void onPreExecute(){
        }
    }
    public class LocalBinder extends Binder {
        public PaymentConnectorService getPaymentConnectorService(){
            return PaymentConnectorService.this;
        }
    }

    @Override
    public void onDestroy()
    {
        super.onDestroy();
        disconnect();
    }

    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }
    private final IBinder mBinder = new LocalBinder();
}

我是如何开始意图的:

Intent intent = new Intent(context, KioskActivity.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(intent);
android android-intent android-asynctask android-service 付款

评论


答: 暂无答案