0

終了後に AsyncTask を実行する方法はありますか?

私のアプリは、画像をキャプチャして imagView に配置し、その上で AsyncTask を実行することです。別の写真を撮るための別のボタンがあり、AysncTask を実行できません。

私はAsyncTaskが1回しか実行できないフォームdeveloper.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);
        }
    }
}
4

5 に答える 5

2

同じインスタンスを 2 回実行することはできません。ただし、電話new segmentTask().execute()は何度でもできます。

于 2012-06-29T13:01:58.507 に答える
1

同じワーカー スレッドを保持し、最初のイメージが終了したらすぐに 2 番目のイメージの処理を開始する場合は、おそらく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

次のように試してください:

    @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 に答える
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 に答える