0

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

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

我知道表单 developer.Android AsyncTask 只能执行一次。

这是我的代码。

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);
        }
    }
}
4

5 回答 5

2

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

于 2012-06-29T13:01:58.507 回答
1

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

于 2012-06-29T13:09:36.583 回答
0

设置计数

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);
    }
于 2012-06-29T13:01:10.293 回答
0
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);
            }

        }

让我知道这是否是您正在寻找的。

于 2012-06-29T13:03:03.557 回答
0

尝试:

    @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);
}
于 2012-06-29T13:03:34.850 回答