снова просочилось окно

1
06-25 15:03:02.596: E/WindowManager(29217):     at com.android.grad.PreviewActivity$1.onClick(PreviewActivity.java:36)
    06-25 15:03:02.596: E/WindowManager(29217):     at android.view.View.performClick(View.java:3527)
    06-25 15:03:02.596: E/WindowManager(29217):     at android.view.View$PerformClick.run(View.java:14234)
    06-25 15:03:02.596: E/WindowManager(29217):     at android.os.Handler.handleCallback(Handler.java:605)
    06-25 15:03:02.596: E/WindowManager(29217):     at android.os.Handler.dispatchMessage(Handler.java:92)
    06-25 15:03:02.596: E/WindowManager(29217):     at android.os.Looper.loop(Looper.java:137)
    06-25 15:03:02.596: E/WindowManager(29217):     at android.app.ActivityThread.main(ActivityThread.java:4441)
    06-25 15:03:02.596: E/WindowManager(29217):     at java.lang.reflect.Method.invokeNative(Native Method)
    06-25 15:03:02.596: E/WindowManager(29217):     at java.lang.reflect.Method.invoke(Method.java:511)
    06-25 15:03:02.596: E/WindowManager(29217):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
    06-25 15:03:02.596: E/WindowManager(29217):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    06-25 15:03:02.596: E/WindowManager(29217):     at dalvik.system.NativeStart.main(Native Method)
    06-25 15:03:04.186: I/Process(29217): Sending signal. PID: 29217 SIG: 9
    06-25 15:03:04.566: D/TextLayoutCache(29339): Using debug level: 0 - Debug Enabled: 0
    06-25 15:03:04.606: D/libEGL(29339): loaded /system/lib/egl/libGLES_android.so
    06-25 15:03:04.606: D/libEGL(29339): loaded /system/lib/egl/libEGL_adreno200.so
    06-25 15:03:04.636: D/libEGL(29339): loaded /system/lib/egl/libGLESv1_CM_adreno200.so
    06-25 15:03:04.636: D/dalvikvm(29339): GC_CONCURRENT freed 117K, 3% free 9125K/9351K, paused 4ms+17ms
    06-25 15:03:04.636: D/libEGL(29339): loaded /system/lib/egl/libGLESv2_adreno200.so
    06-25 15:03:04.706: D/OpenGLRenderer(29339): Enabling debug mode 0
    06-25 15:03:07.326: D/OpenGLRenderer(29339): Flushing caches (mode 0)
    06-25 15:03:07.326: W/IInputConnectionWrapper(29339): showStatusIcon on inactive InputConnection
    06-25 15:03:07.366: D/OpenGLRenderer(29339): Flushing caches (mode 1)

Я знаю, что эта ошибка задавалась раньше, и я видел решения для этого, но решения не работают со мной. и это мой код.

Ошибка появляется на pd.show().

@Override
protected void onPreExecute() {
    //network.loadData();
    file = new File(
            Environment
                    .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
            "MyCameraApp" + File.separator + "project");
    createProgressDialog();
    pd.show();
}

@Override
protected Boolean doInBackground(String... params) {
    try {
        crop = new Crop(params[0]);
        crop.cropID();
        croppedID = crop.getId();
        publishProgress(2);
    } catch (IOException e) {
    }

    segmentNumbers();
    return true;
}

@Override
protected void onProgressUpdate(Integer... values) {
    pd.incrementProgressBy(values[0]);
}

@Override
protected void onPostExecute(Boolean result) {
    pd.dismiss();
    Toast.makeText(activity, "Processing Done", Toast.LENGTH_LONG).show();
}

private void createProgressDialog() {
    pd = new ProgressDialog(activity);
    pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    pd.setTitle("Extract ID");
    pd.setMessage("Processing...");
    pd.setIcon(R.drawable.ic_launcher);
    pd.setProgress(0);
    pd.setCancelable(false);
}

Метод onpreExecution: - Я показываю свой диалог. doInBackGround метод: - Я выполняю свой segmentNumber(), который используется для разделения изображения. Метод onPostExecution: - Я отклоняю свой диалог.

Измененный код:

package com.OCR.ID;

import java.io.File;
import java.io.IOException;

import org.neuroph.contrib.imgrec.image.Image;
import org.neuroph.contrib.imgrec.image.ImageFactory;

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Environment;
import android.util.Log;
import android.widget.Toast;

import com.Camera.R;

    /**
     * @author Mahmud
     * 
 */
public class Segement extends AsyncTask<String, Integer, Boolean> {

    int[][] croppedID;
    Crop crop;
    private Activity activity;
    private ProgressDialog pd;
    File file;
    private String ID;
    private Neuroph network;

    public Segement(Activity activity, ProgressDialog pd) throws IOException {
        this.activity = activity;
        this.pd = pd;
        //network = new Neuroph(this.activity);
    }

    @Override
    protected void onPreExecute() {
        //network.loadData();
        file = new File(
                Environment
                        .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
                "MyCameraApp" + File.separator + "project");
    }

    @Override
    protected Boolean doInBackground(String... params) {
        try {
            crop = new Crop(params[0]);
            crop.cropID();
            croppedID = crop.getId();
            publishProgress(2);
        } catch (IOException e) {
        }

        segmentNumbers();
        return true;
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        pd.incrementProgressBy(values[0]);
    }

    @Override
    protected void onPostExecute(Boolean result) {
        pd.dismiss();
        Toast.makeText(activity, "Processing Done & your ID : " + ID,
                Toast.LENGTH_LONG + Toast.LENGTH_LONG).show();
    }


    /**
     * Segment cropped image into number
     */
    public void segmentNumbers() {
        int count = 0, endOfNumber = 0, startOfNumber = 0;
        int[][] number = null;

        while (crop.getxProjection()[endOfNumber] == 0
                && endOfNumber != crop.getxProjection().length - 1)
            endOfNumber++;

        while (endOfNumber != croppedID.length - 1) {
            endOfNumber = startOfNumber;

            while (crop.getxProjection()[endOfNumber] != 0
                    && endOfNumber != crop.getxProjection().length - 1)
                endOfNumber++;

            if (endOfNumber - startOfNumber < 10) {
                startOfNumber = endOfNumber;
                while (crop.getxProjection()[startOfNumber] == 0
                        && endOfNumber != crop.getxProjection().length - 1)
                    startOfNumber++;
                continue;
            }

            if (startOfNumber >= croppedID.length
                    || endOfNumber >= croppedID.length)
                break;

            number = new int[endOfNumber - startOfNumber - 1][croppedID[0].length];

            for (int i = 0; i < number.length; i++)
                for (int j = 0; j < number[i].length; j++)
                    number[i][j] = croppedID[i + startOfNumber][j];

            number = verticalProjectionForNumber(number);

            File numberFile = AndroidImage.save(activity,
                    AndroidImage.write2DIntoImage(number),
                    Integer.toString(count));
//          Image image = ImageFactory.getImage(numberFile.getAbsoluteFile());
//          ID += network.recognize(image);

            //
            // file.getPath() + File.separator + Integer.toString(count) +
            // ".PNG");
            publishProgress(7);

            startOfNumber = endOfNumber;
            while (crop.getxProjection()[startOfNumber] == 0
                    && endOfNumber != crop.getxProjection().length - 1)
                startOfNumber++;

            count++;
        }

        Log.d("ID", ID);
    }

    /**
     * Do vertical projection on each number
     */
    private int[][] verticalProjectionForNumber(int[][] number) {

        int[] projection = new int[number[0].length];

        for (int i = 0; i < (number[0].length * 0.90); i++) {
            for (int j = 0; j < number.length; j++) {
                projection[i] += number[j][i];
            }
        }

        int first = 0;
        while (projection[first] == 0)
            first++;

        int last = projection.length - 1;
        while (projection[last] == 0)
            last--;

        int[][] modifiedNumber = new int[number.length][last - first];
        for (int i = 0; i < modifiedNumber.length; i++)
            for (int j = 0; j < modifiedNumber[i].length; j++)
                modifiedNumber[i][j] = number[i][j + first];

        number = null;
        projection = null;
        System.gc();

        return modifiedNumber;
    }
}

И я назвал задачу отсюда: -

OnClickListener processOnClickListener = new OnClickListener() {
        public void onClick(View v) {
            try {
                createProgressDialog();
                pd.show();
                new Segement(PreviewActivity.this, pd).execute(path);
            } catch (IOException e) {
            }
        }
    };
  • 0
    Не могу многое сказать из вашего кода, кроме того, что я не вижу никакого назначения для pd.
  • 0
    Смотрите эту статью blogactivity.wordpress.com/2011/09/01/proper-use-of-asynctask
Показать ещё 3 комментария
Теги:

2 ответа

3

Правильный ответ Гавайев.

Чтобы быть более конкретным, метод doInBackground не синхронизируется с потоком пользовательского интерфейса. Таким образом, вы никогда не должны обновлять свои представления/макеты/все, что связано с UI в этом методе. Я предлагаю вам show() ваше диалоговое окно перед выполнением AsyncTask.

  • 0
    Этот ответ на 100% неверен. onPreExecute() также вызывается в потоке пользовательского интерфейса для использования при обновлении элементов пользовательского интерфейса: developer.android.com/reference/android/os/AsyncTask.html
  • 0
    @Devunwired, спасибо, что поддержал меня :). Новички StackOverflow действительно ненавидят меня сегодня, ха-ха
Показать ещё 1 комментарий
0

Перед выполнением задачи вы должны show() свой Dialog.

В AsyncTask вы можете использовать только OnProgressUpdate и onPostExecute для обновления вашего UI.

createProgressDialog();
pd.show();
task.execute();

И измените свой метод на

private void createProgressDialog() {
    pd = new ProgressDialog(YourMainActivity.this);
    pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    pd.setTitle("Extract ID");
    pd.setMessage("Processing...");
    pd.setIcon(R.drawable.ic_launcher);
    pd.setProgress(0);
    pd.setCancelable(false);
}
  • 0
    не понимаю, где я могу позвонить выполнить ???
  • 0
    В вашем Java-коде перед выполнением AsyncTask вы показываете диалог, как я написал выше.
Показать ещё 18 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню