提问人:z123 提问时间:6/13/2023 更新时间:6/13/2023 访问量:14
服务中的异步任务在第二次运行时为付款连接器返回 null
Async Task in Service Returning Null For Payment Connector on Second Run
问:
我是 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);
答: 暂无答案
评论