2012-06-29 33 views
0

是否有辦法在完成後運行我的AsyncTask?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); 
     } 
    } 
} 

回答

2

無法運行同一個實例兩次。但是,您可以根據需要多次撥打new segmentTask().execute()

+0

但是當我使用新segmentTask()執行() 它不工作 –

+0

這是工作,我還有一個錯誤在我的課不是在的AsyncTask –

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

     } 

讓我知道這是你在找什麼。

+0

沒有什麼是這一點,如果條件 –

+0

告訴你設置條件防止無限循環 –

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

如果你想保持相同的工作線程,並儘快開始第一個被處理完第二圖像,更好的解決方案可能會被使用Handler。它允許您發佈作業,以便順序執行作業。