0

ピクセルごとの編集を含むアンドロイドで画像処理を行う必要があります。これには少し時間がかかり、画面がそこでフリーズするだけなので、読み込みダイアログを実行して、プログラムがまだ実行中であることをユーザーに知らせたいと思いました。

この editPhoto 関数は、バックグラウンドで実行する必要があるものです。

 private void editPhoto() {
    if (editPhotoImg.getDrawable() == null) {
        Toast.makeText(getApplicationContext(), "No Photo Selected",
                Toast.LENGTH_SHORT).show();
    } else if (hasSample == false) {
        Toast.makeText(getApplicationContext(), "No Sample Photo Selected",
                Toast.LENGTH_SHORT).show();
    } else {


        detectFaces(false);


        BitmapDrawable ebm = (BitmapDrawable) editPhotoImg.getDrawable();

        Bitmap editTemp = ebm.getBitmap();
        PointF editFaceMidPoint = getFaceMidPoint(editTemp);

        BitmapDrawable sbm = (BitmapDrawable) samplePhotoImg.getDrawable();
        Bitmap sampleTemp = sbm.getBitmap();
        PointF sampleFaceMidPoint = getFaceMidPoint(sampleTemp);

        if (editFaceMidPoint != null && sampleFaceMidPoint != null) {
            int editFaceMidPointPixel = editTemp.getPixel(
                    (int) editFaceMidPoint.x, (int) editFaceMidPoint.y);
            int sampleFaceMidPointPixel = sampleTemp.getPixel(
                    (int) sampleFaceMidPoint.x, (int) sampleFaceMidPoint.y);

            editPhotoImg.setImageBitmap(shiftRGB(editTemp,
                    editFaceMidPointPixel, sampleFaceMidPointPixel));

            savePhoto();

            detectFaces(true);
        }
    }

}

そして、これは私が望むものを達成しない私の AsyncTask コードです。識別さえできなかったエラーが表示されます。ロードダイアログの前後ではなく、ロードダイアログの後ろで実行されるように、何をすべきか、どこで editPhoto() メソッドを呼び出す必要があるか教えてもらえますか?

     private class LoadEditPhoto extends AsyncTask<Void, Integer, Void> {
    // Before running code in separate thread

    @Override
    protected void onPreExecute() {
        /* Create a new progress dialog
        progressDialog = new ProgressDialog(EditPhoto.this);
        // Set the progress dialog to display a horizontal progress bar
        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        // Set the dialog title to 'Loading...'
        progressDialog.setTitle("Loading...");
        // Set the dialog message to 'Loading application View, please
        // wait...'
        progressDialog.setMessage("Loading application View, please wait...");
        */
        progressDialog = ProgressDialog.show(EditPhoto.this,"Loading...",  
                "Editing Photo, please wait...", false, false);  
        // This dialog can't be canceled by pressing the back key
        progressDialog.setCancelable(false);
        // This dialog isn't indeterminate
        progressDialog.setIndeterminate(false);
        // The maximum number of items is 100
        progressDialog.setMax(100);
        // Set the current progress to zero
        progressDialog.setProgress(0);
        // Display the progress dialog
        progressDialog.show();
    }

    // The code to be executed in a background thread.
    @Override
    protected Void doInBackground(Void... params) {
        /*
         * This is just a code that delays the thread execution 4 times,
         * during 850 milliseconds and updates the current progress. This is
         * where the code that is going to be executed on a background
         * thread must be placed.
         * 
         */


        editPhoto();
        publishProgress(100);
        return null;
    }

    // Update the progress
    @Override
    protected void onProgressUpdate(Integer... values) {
        // set the current progress of the progress dialog
        progressDialog.setProgress(values[0]);
    }

    // after executing the code in the thread
    @Override
    protected void onPostExecute(Void result) {
        // close the progress dialog
        progressDialog.dismiss();

    }
}
4

2 に答える 2

1

トースト メッセージを削除すると、動作するはずです。メソッドから UI を更新することはできませんdoInBackground。それ以外は、コードは問題なく見えます。したがって、これはバグである必要があります。

または runOnUi() を使用してトースト メッセージを表示します。

トーストをこのように囲み、

ActivityObject.runOnUiThread(new Runnable() {

        @Override
        public void run() {
            Toast.makeText(this, message, Toast.LENGTH_LONG).show();
        }
    });
于 2013-01-21T10:06:41.210 に答える
1

スレッドeditPhoto()に入れます。

次に、複数のメッセージを処理する次のコードを定義します。

public enum WhatAbout {
    START,STOP
}

public WhatAbout[] wa = WhatAbout.values();

次に、通信に役立つHandlerを使用します。ハンドラーを使用しないと、変更できません。BackgroundThreadUIThreadUI

メソッドに次のコードを挿入しますonCreate

handler = new Handler() {
  @Override
  public void handleMessage(Message msg) {
    if (msg.what < wa.length) {
    switch (wa[msg.what]) 
    {
    case START:
         progressDialog = ProgressDialog.show(getActivity(), null,
                        "Editing Photo... Please Wait...");
         break;

    case STOP:
         if (progressDialog.isShowing())
            progressDialog.dismiss();

         imageView.setImageBitmap(editedBitmap);
         break;
    }
  }
};

で編集を開始したらThread、次のコードを の最初の行に配置しeditPhoto()ます。

handler.sendMessage(handler.obtainMessage(
                WhatAbout.START.ordinal(), 0, 0));

完了したらediting、次のコードを の最後に配置しeditPhoto()ます。

handler.sendMessage(handler.obtainMessage(
                WhatAbout.STOP.ordinal(), 0, 0));
于 2013-01-21T10:24:46.443 に答える