как исправить приложение не отвечает? - PullRequest
4 голосов
/ 21 декабря 2011

Я подготовил приложение для рисования, мое приложение содержит одно настраиваемое представление для рисования. Когда мы рисуем любую вещь в настраиваемом представлении, просто собираем нарисованные пиксели и сохраняем их в списке массивов, сначала все работает нормально (но это занимает много времени) ивторой раз «Activity MyAlphabets (в приложении MyAlphabets) не отвечает (принудительное закрытие и ожидание)».

Мой код,

public void onDraw(Canvas canvas) {

        if (myDrawBitmap == null) {
            myDrawBitmap = Bitmap.createBitmap(canvas.getWidth(),
                    canvas.getHeight(), Bitmap.Config.ARGB_8888);
            bmpDrawCanvas = new Canvas(myDrawBitmap);
            intDrawArray = new int[myDrawBitmap.getWidth()
                    * myDrawBitmap.getHeight()];
        }
        if (bmpDrawCanvas != null) {
            for (Path path : MyActivity.mArryLstPath) {
                bmpDrawCanvas.drawPath(MyActivity.mPath,
                        mPaintAlphabet);
            }
myDrawBitmap.getPixels(intDrawArray, 0, 220, 0, 0, 220, 305);
                   for (int i = 0; i < intDrawArray.length; i ++) {

                if (intDrawArray[i] == 0xFFFFFFFF) {

                    if (MyActivity.mArryLstDrawnPixels.contains(i)) {

                    } else {
                        MyActivity.mArryLstDrawnPixels.add(i);
                    }
                }
}

, когда мы нажимаем «принудительное закрытие» Logcat,

INFO/ActivityManager(52): Killing process com.qteq.myapplication (pid=225) at user's request

 INFO/Process(52): Sending signal. PID: 225 SIG: 9

 INFO/ActivityManager(52): Process com.qteq.myapplication (pid 225) has died.

 INFO/WindowManager(52): WIN DEATH: Window{608fbd10 com.qtq.myapplication/com.qtq.myapplication.MyApplicationActivity paused=false}

 INFO/UsageStats(52): Unexpected resume of com.android.launcher while already resumed in com.qtq.myapplication
 ERROR/gralloc(52): [unregister] handle 0x4a2740 still locked (state=40000001)

 WARN/InputManagerService(52): Got RemoteException sending setActive(false) notification to pid 225 uid 10025

Это правильный способ сбора цветных пикселей во время рисования. Пожалуйста, помогите мне ..

как решить эту проблему.пожалуйста, помогите мне ..

1 Ответ

7 голосов
/ 21 декабря 2011

Ваше приложение обязательно получит ошибки «Приложение не отвечает», так как вы выполняете все свои вычисления, включая распределение в потоке пользовательского интерфейса (onDraw).

Во-первых, вы должны попытаться переместить вычисления в не-пользовательский поток (см. AsyncTask ).Любая операция, которая занимает более 20 мс, обязательно вызывает сообщение «Приложение не отвечает».

Во-вторых, вы должны попытаться реорганизовать свой код так, чтобы вам не приходилось выполнять вычисления каждый раз, когда вам нужнорисовать.По сути, рендеринг вашего изображения - это растровое изображение вне экрана, кэшируйте его и визуализируйте из кэшированной копии в onDraw.Боюсь, что рамки «как» выходят за рамки этой дискуссии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...