代码之家  ›  专栏  ›  技术社区  ›  Simptive

获取线程会导致Android的另一个活动

  •  1
  • Simptive  · 技术社区  · 6 年前

    我的主要活动调用 ResultActivity 同时调用 Runnable 线程。我希望结果活动不等待结果处理(映像)的某些部分,这些部分稍后可能由线程提供,并且UI可能会相应地更新。

    下面给出了我的尝试。

    mainActivity(下面的方法实际上是 callback 从另一个 thread ):

    @Override
    public void onCreate(Context context) {
        resultImageProcessor = new ResultImageProcessor();
        resImgProThread = new Thread(resultImageProcessor);
    }
    
    @Override
    public void onBarcodeDetected(final Barcode barcode) {
        resultImageProcessor.setCameraBarcode(mCameraSource,barcode);
        resImgProThread.start();
    
        Intent intent = new Intent(this, ResultActivity.class);
        intent.putExtra(BarcodeObject, barcode);
        intent.putExtra(ResultCode, CommonStatusCodes.SUCCESS);
        intent.putExtra(ResImgProcObject, resultImageProcessor);
        startActivity(intent);
    }
    

    结果图像处理器:

    public class ResultImageProcessor implements Serializable, Runnable {
    
        private ResultActivity resultActivityContext;
    
        ResultImageProcessor(){
            this.resultActivityContext = null;
        }
    
        public void setResultActivity(ResultActivity resultActivity) {
            this.resultActivityContext = resultActivity;
        }
    
        public void setCameraBarcode(CameraSource cameraSource, Barcode barCode){
            mCameraSource = cameraSource;
            barcode = barCode;
        }
    
        @Override
        public void run() {
            String picPath = ProcessImage(Obj..Attributes);
            //wait until result activity context is not set
            while(resultActivityContext == null){
                try {
                    sleep(50);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            resultActivityContext.onImageSaved(picPath);
        }
    }
    

    结果活动:

    protected void onCreate(Bundle savedInstanceState) {
        //...
        data = getIntent();
        Barcode barcode = data.getParcelableExtra(MainActivity.BarcodeObject);
        ResultImageProcessor resultImageProcessor = data.getParcelableExtra(MainActivity.ResImgProcObject);
        resultImageProcessor.setResultActivity(this);
    }
    
    //called from Result image processor
    public void onImageSaved(String imagePath){
        ImageView barImgView = findViewById(R.id.barcode_image);
        Bitmap barcodeImage = BitmapFactory.decodeFile(imagePath);
        barImgView.setImageBitmap(barcodeImage);
        barImgView.invalidate();
    }
    

    调用后,使用上面的代码 resultImageProcessor.startProcessing() ,结果活动既不启动也不可运行 run() 方法在while循环中保持忙碌。我用记录器追踪它们。当我跳过线程并将图像路径传递给活动时,除了活动切换速度慢之外,一切都很好。

    请指出问题或提出更好的解决方案。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Master Fathi    6 年前

    我想你在你的跑步场里像这样跑丢了

    new Runnable() {
                @Override
                public void run() {
                    String picPath = ProcessImage(Obj..Attributes);
                    //wait until result activity context is not set
                    while(resultActivityContext == null){}
                    resultActivityContext.onImageSaved(picPath);
                }
            }.run();
    
        2
  •  1
  •   Simptive    6 年前

    结果发现问题是在传球 ResultImageProcessor 对象到 ResultActivity 意图如 可分包的 . 我走了一条简单的声明之路 resultActivityContext 作为静态 结果图像处理器 .

    public class ResultImageProcessor implements Runnable {
        public static ResultActivity resultActivityContext;
        ...
        @Override
        public void run() {
            ...
            resultActivityContext.onImageSaved(picPath);
            resultActivityContext = null;
        }
    }
    

    在结果活动中:

    ResultImageProcessor.resultActivityContext = this;