2012-12-02 81 views
1

我在寫一個應該有以下用例的應用程序:用戶點擊'Start!'按鈕,應用程序每隔1分鐘開始點擊圖片(內部使用CameraPreview類),並將按鈕文本更改爲「完成!」。android camera clickat fixed frequency

當用戶按下相同的按鈕(但有一個新的按鈕文本「完成!」),應用程序應該停止。

我已經能夠編寫代碼,當用戶點擊「開始!」時,每隔一分鐘點擊圖片。按鈕。但是,一旦圖像捕捉開始,按鈕就會凍結。

如何以按鈕不凍結的方式運行我的圖像捕獲 - 每1分鐘邏輯?有什麼最好的做法呢?謝謝!

這裏是的OnClick()的代碼:

@Override 
public void onClick(View v) { 
    Button button = (Button)v; 
    String buttonText = button.getText().toString(); 

    if(buttonText.equals(Constant.trainButtonText)) { 
     Log.i(TAG, "Robot Training started..."); 

     while(true) { 
      surfaceView.capture(new Camera.PictureCallback() { 
       public void onPictureTaken(byte[] data, Camera camera) { 
        Log.v("Still", "Image data received from camera"); 

        String[] params = new String[] { 
          Constant.Server, // Server URL 
          Long.toString(new Date().getTime()), // Image Timestamp 
          Constant.userId // Unique user ID for each customer 
        }; 
        new UploadImageToWebServiceTask(data).execute(params); 
        camera.startPreview(); 
       } 
      }); 
      try { 
       // Capture every 1 minute until 'training done!' is not clicked 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 

    } 
    else if(buttonText.equals(Constant.doneTrainingButtonText)) { 
     Log.i(TAG, "Robot Training completed..."); 
     button.setText(Constant.trainButtonText); 
     button.clearFocus(); 
    } 
} 

在代碼相同的按鈕是用來 - 只是我們決定基於按鈕上的文字做什麼。

+0

請發表您的相關代碼。 – Sam

+0

完成!謝謝你的時間。 –

回答

2

不要阻塞UI線程,切換到Runnable。你也是每秒拍一張照片:1000是一秒,60000是一分鐘。

首先創建一個新字段變量:

public class MainActivity extends Activity { 
    Runnable takePictures = new Runnable() { 
     @Override 
     public void run() { 
      // I'll trust that this code works 
      surfaceView.capture(new Camera.PictureCallback() { 
       public void onPictureTaken(byte[] data, Camera camera) { 
        Log.v("Still", "Image data received from camera"); 

        String[] params = new String[] { 
          Constant.skynetNNServer, // Server URL 
          Long.toString(new Date().getTime()), // Image Timestamp 
          Constant.userId // Unique user ID for each customer 
        }; 
        new UploadImageToCloudTask(data).execute(params); 
        camera.startPreview(); 
       } 
      }); 

      // Call this runnable again in 60 seconds (60000 milliseconds) 
      surfaceView.postDelayed(this, 60000); 
     } 
    }; 
    // Rest of your code 

然後改變你的onClick方法:

​​
+0

謝謝,山姆!後續問題:您是如何在可運行的,異步任務和服務之間進行選擇的? –

+0

我在你的SurfaceView中使用了我的Runnable中的Handler,因爲當你想在短暫延遲'postDelayed(takePictures,60000)'之後運行代碼時,Handlers非常簡單。 AsyncTask用於保持緩慢的進程影響用戶。即使在您的活動未運行時,服務也可用於後臺運行的代碼。 – Sam

+0

有一件事:所以你建議的改變會繼續照相'永遠'(即使我點擊'完成!'按鈕)。如果我們點擊'完成!',我們如何才能使Runnable停止執行。按鈕?謝謝你的時間。 –