一个很神奇的问题,求大哥们帮忙解决~~~

各位大神们,请问Activity的生命周期会不会这样:
场景:一个Activity 启动另一个Activity
原因:正常情况 第一个Activity先 onPause 第二个Activity 在onResume
问题,有没有可能会反过来? 就是第二个Activity 先onResume 第一个Activity在onPause

问题复现

ScanUserActivity 的 onResume 初始化了RFID读取线程的监听器,onPause 停止监听器,并销毁线程。接着跳转到扫描RFID的界面。

在ScanRfidActivity 界面的 onResume 初始化了RFID读取线程的监听器,onPause 停止监听器,并销毁线程。

正常逻辑是没问题的。但是在项目中。十次有两次会出现,线程监听器为空的情况。
还有一种情况就是,在扫描RFID(ScanRfidActivity)的界面,调用的是扫描用户(ScanUserActivity)的接口

如下是项目的相关代码。

MenuActivity.java

进入ScanUserActivity

public void transport(View view) {
    if (ModuleManager.getInstance().canHand()) {
        MenuActivity.Key_PACK_MODE = MenuActivity.Key_PACK_Tran;
        startActivity(ScanUserActivity.class);
    } else {
        T.showLong("请申请操作权限");
    }
}

ScanUserActivity

扫描到数据后,请求接口,并跳转到ScanRfidActivity
JSONObjectDialogCallBack Context已经声明为软引用了

public class ScanUserActivity extends BaseScanBarCodeAndRfidActivity {
    @Override
    protected void onResume() {
        super.onResume();
        //设置图标
        setTitleRightImage(R.mipmap.scan_icon, new View.OnClickListener() {
            @Override
            public void onClick(View v) {
     	       //设置按钮扫描
                MyApplication.getPosApiService().scan();
            }
        });
    }

    @Override
    protected void getRfidCode(String rfid) {
        if (!mCurrentRfid.equals(rfid))
    	    //rfid结果
            reqUserInfo(SPUtil.getLoginUserId(), rfid);
    }

    @Override
    protected void getBarCode(String barCode) {
    	// 扫描二维码结果
        reqUserInfo(SPUtil.getLoginUserId(), barCode);
    }

    private void reqUserInfo(long UserId, String Username) {
        OkGo.<JSONObject>get(UrlsConstant.GetUser)
                .params("Username", Username)
                .params("UserId", UserId)
                .execute(new JSONObjectDialogCallBack(mContext) {
                    @Override
                    public void onSuccess(Response<JSONObject> response) {
                        String data = response.body().optString("data"); 
                        PackUserInfoData packUserInfoData = GsonUtil.j2o(data, PackUserInfoData.class); 
                        
                        PackUserInfoData.putDisk(mContext, packUserInfoData); 
                        
                        if (MenuActivity.Key_PACK_MODE == MenuActivity.Key_PACK_Tran) {
                            startActivityAndFinish(ScanRfidActivity.class);
                        } else {
                            startActivityAndFinish(SelectHandModeActivity.class);
                        }
                    }
                });
    }  
}

ScanRfidActivity

public class ScanRfidActivity extends BaseScanRfidActivity {
    @Override
    protected void getRfidCode(String rfid) {
        if (!mCurrentRfid.equals(rfid)) {
            getRfidData(SPUtil.getLoginUserId(), rfid);
        }
    }

    private void getRfidData(long UserId, final String RfidCode) {
        OkGo.<JSONObject>get(UrlsConstant.GetRubbishByRfidCode)
                .params("UserId", UserId)
                .params("RfidCode", RfidCode)
                .execute(new JSONObjectDialogCallBack(mContext) {
                    @Override
                    public void onSuccess(Response<JSONObject> response) { 
                        startActivity(RegPackActivity.class, RfidCode);
                        finish();
                    }
                });
    }
}

BaseScanBarCodeAndRfidActivity

扫描二维码和RFID的基类

public abstract class BaseScanBarCodeAndRfidActivity extends BaseActivity {
    protected String mCurrentRfid = "";
    private PosRfidService mRfidService;

    @Override
    protected void onPause() {
        super.onPause();
        MyApplication.getPosApiService().unRegScanKeyDownReceiver();
        MyApplication.getPosApiService().unRegScanResultBroadcastReceiver();
        mRfidService.stop();
    }

    @Override
    protected void onResume() {
        super.onResume();
        mRfidService = MyApplication.getRfidService();

        mRfidService.read(new BeeScanResultListener() {
            @Override
            public void result(String result) {
                super.result(result);
                getRfidCode(result);
                mCurrentRfid = result;
            }
        });
        MyApplication.getPosApiService().regScanKeyDownReceiver(new ScanKeyDownListener());

        MyApplication.getPosApiService().regScanResultBroadcastReceiver(new BeeScanResultListener() {
            @Override
            public void result(String barCode) {
                super.result(barCode);
                if (!TextUtils.isEmpty(barCode)) {
                    getBarCode(barCode);
                }
            }
        });

    }

    protected abstract void getRfidCode(String rfid);

    protected abstract void getBarCode(String barCode);
}

PosRfidService

public void stop() {
    runFlag = false;
    mRfidReader.setScanResultListener(null);
    mRfidReader.interrupt();
    mRfidReader = null;
}
public void read(ScanResultListener scanResultListener) {
     runFlag = true;
     mRfidReader = new RfidReader(scanResultListener);
     //线程池
     mRfidThreadServer.submit(mRfidReader);
 }

RfidReader

这个类是PosRfidService的内部类

private class RfidReader extends Thread {
	private ScanResultListener mScanResultListener;
	
	public RfidReader(ScanResultListener scanResultListener) {
		mScanResultListener = scanResultListener;
	}
	
	public void setScanResultListener(ScanResultListener scanResultListener) {
		mScanResultListener = scanResultListener;
	}
	
	@Override
	public void run() {
		super.run();	
		while (runFlag && !isInterrupted()) {
			//实时盘存
			.......
			final String epcStr = Tools.Bytes2HexString(epc, epc.length);
			//这个位置的监听器会是空的。
			if (mScanResultListener != null) {
				mScanResultListener.result(epcStr.trim());
			}
			
			try {
				sleep(50);
			} catch (InterruptedException e) {
				e.printStackTrace();
				return;
			}
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值