再一次异步任务



有没有办法在完成后运行我的 AsyncTask?

我的应用程序是捕获图像并将其放在imagView上,然后对其执行AsyncTask。我有另一个按钮可以拍摄另一张照片,然后将其放下无法执行AysncTask。

我知道表单开发人员。AsyncTask只能执行一次的Android。

这是我的代码。

package com.ocr.id;
import java.io.File;
import java.io.IOException;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
import com.ocr.id.ip.AndroidImage;
import com.ocr.id.ip.Binarization;
import com.ocr.id.ip.Crop;
import com.ocr.id.ip.Segement;
public class PreviewActivity extends Activity {
    private ImageView previewIV;
    private final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100;
    private String path;
    private boolean crop = true;
    private boolean resample = true;
    Crop cropID;
    Binarization binary;
    Segement seg;
    ProgressDialog previewPD;
    OnClickListener processOnClickListener = new OnClickListener() {
        public void onClick(View v) {
            segementTask task = new segementTask();
            task.execute(path);
            }
    };
    private OnClickListener backOnClickListener = new OnClickListener() {
        public void onClick(View v) {
            startActivityForResult(
                    new Intent(MediaStore.ACTION_IMAGE_CAPTURE).putExtra(
                            MediaStore.EXTRA_OUTPUT,
                            Uri.fromFile(new File(path))),
                    CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
        }
    };
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
            if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
                previewIV.setImageBitmap(AndroidImage
                        .decodeSampledBitmapFromSDcard(path, 1000, 1000));
            }
        }
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.preview);
        path = getIntent().getExtras().getString("path");
        previewIV = (ImageView) findViewById(R.id.previewPicID);
        Button process = (Button) findViewById(R.id.processID);
        process.setOnClickListener(processOnClickListener);
        Button back = (Button) findViewById(R.id.back);
        back.setOnClickListener(backOnClickListener);
        previewIV.setImageBitmap(AndroidImage.decodeSampledBitmapFromSDcard(
                path, 1000, 1000));
    }
    class segementTask extends AsyncTask<String, Integer, Void> {
        @Override
        protected void onPreExecute() {
            previewPD = ProgressDialog.show(PreviewActivity.this, "Id-OCR",
                    "Processing...");
            previewPD.setCancelable(false);
            super.onPreExecute();
        }
        @Override
        protected Void doInBackground(String... params) {
            try {
                seg = new Segement(PreviewActivity.this, params[0]);
                seg.segmentNumbers();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
        @Override
        protected void onPostExecute(Void result) {
            previewPD.dismiss();
            previewPD = null;
            Toast.makeText(PreviewActivity.this, "Processing done",
                    Toast.LENGTH_LONG).show();
            super.onPostExecute(result);
        }
    }
}

您不能将同一实例运行两次。但是您可以根据需要多次拨打new segmentTask().execute()

如果要保留相同的工作线程,并在第一个图像完成后立即开始处理第二个图像,则更好的解决方案可能是使用 Handler。它允许您发布作业,以便按顺序执行作业。

设置计数

int mNumTaskFinished = 0;

创建受保护的方法:

protected method didTaskFinished( AsyncTask task ){
     if(mNumTaskFinished == 0){
         task.execute(path);
     }
}

在AsyncTask中,您可以调用:

@Override
    protected void onPostExecute(Void result) {
        previewPD.dismiss();
        previewPD = null;
        Toast.makeText(PreviewActivity.this, "Processing done",
                Toast.LENGTH_LONG).show();
        didTaskFinished(this);
        super.onPostExecute(result);
    }
protected void onPostExecute(Void result) {
            previewPD.dismiss();
            previewPD = null;
            Toast.makeText(PreviewActivity.this, "Processing done",
                    Toast.LENGTH_LONG).show();
            super.onPostExecute(result);'
            if(setAcondition) {
                new segementTask().execute(whateverPath);
            }
        }

让我知道这是否是您要找的。

尝试为:

    @Override
    protected void onPostExecute(Void result) {
        previewPD.dismiss();
        previewPD = null;

        if (task.getStatus() == AsyncTask.Status.FINISHED)
            tTaskFinished();
        Toast.makeText(PreviewActivity.this, "Processing done",
                Toast.LENGTH_LONG).show();
        super.onPostExecute(result);
    }
protected void tTaskFinished( ){
     task = new MyAsyncTask();
     task.execute(path);
}

最新更新