Гость
Форумы / Android [игнор отключен] [закрыт для гостей] / Android 5 multithreading / 6 сообщений из 6, страница 1 из 1
23.04.2015, 18:14
    #38943834
Петровичч
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Android 5 multithreading
Написал вьюшку с фоновой отрисовкой в Bitmap.
Код под спойлером, он большой, но простой.
Два битмапа. Один отображается, во второй рисуется картинка по запросу. После прорисовки битмапы переключаются.

На android 4xx все работает отлично.
На android 5 все тормозит, большие лаги, в логах идет сообщение - Choreographer: Skipped 60 frames! The application may be doing too much work on its main thread

При этом, если я из процедуры drawThread() просто уберу строку: synchronized (this) { useBMP = n; }
или уберу переключение через if( useBMP==0 ) n=0;
то все работает плавно и быстро! Безусловно - с артефактами.

Я в тупике, не могу понять причину этого.
Интересует любая идея и любая информация которая может помочь.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
public class TouchView extends ScrollView {
    volatile int useBMP;
    Bitmap    cacheBMP[];
    boolean   startDraw, exitDraw;

    public TouchView(Context context) {
        super(context);

        cacheBMP = new Bitmap[2];
    }

    protected void  onSizeChanged (int w, int h, int oldw, int oldh) {
        for( int i=0; i<2; i++ )
            cacheBMP[i] = Bitmap.createBitmap(w*2, h*2, Bitmap.Config.ARGB_8888);

        useBMP=0;
        startDraw = true;
    }

    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();

        exitDraw = false;
        new Thread(new Runnable() {
            public void run() {  drawThread();  }
        }).start();
    }

    @Override
    protected void onDetachedFromWindow() {
        exitDraw = true;

        super.onDetachedFromWindow();
    }

    void drawThread() {
        int  n;
        while( true ) {
            if( exitDraw )  break;
            if( startDraw ) {
                startDraw = false;

                if( useBMP==0 )  n=1;
                else             n=0;

                drawBMP(n);

                synchronized (this) { useBMP = n; }
                postInvalidate();
            }

            try {
                TimeUnit.MILLISECONDS.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    void drawBMP(int n) {
        cacheBMP[n].eraseColor(Color.WHITE);
        Canvas canvas = new Canvas(cacheBMP[n]);
      .....
    }

    public void redraw() {
        startDraw = true;
    }

    @Override
    protected void onDraw(Canvas c) {
        synchronized (this) {
                c.drawBitmap(cacheBMP[useBMP],0,0,p);
        }
    }
}

...
Рейтинг: 0 / 0
23.04.2015, 18:49
    #38943874
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Android 5 multithreading
Петровичч,

через Handler попробуй, вместо синхронизации. У меня на пятерке все работает без тормозов и ругательств.
...
Рейтинг: 0 / 0
23.04.2015, 18:57
    #38943882
Петровичч
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Android 5 multithreading
wadman,

Я не понял идею. Можешь чуть подробнее объяснить.
В принципе синхронизация тут не очень нужна.
Без нее на 4 андроиде все работает, а на андроид 5 все также тормозит.
...
Рейтинг: 0 / 0
24.04.2015, 09:04
    #38944149
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Android 5 multithreading
Подробнее тут https://developer.android.com/intl/ru/training/multiple-threads/communicate-ui.html
Даже пример с битмапом приводят.

Вкратце: создаешь Handler-ы (это очередь сообщений) для активности и для потока. И с помощью них общаешься между потоками в порядке очереди.
...
Рейтинг: 0 / 0
25.04.2015, 02:02
    #38945105
Петровичч
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Android 5 multithreading
wadman,

Переделал на Handler. Ничего не изменилось.
Android 4 работает нормально, Android 5 тормозит. Если отключить переключение битмапов и использовать только один - все работает быстро и гладко.. Но рисует артефакты..

Хенделер это просто способ передать данные, он нужен при сложном взаимодействии тредов.
У меня же все просто - нужно только сказать какой битмап использовать.


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
public class TouchView extends ScrollView {
    int       useBMP;
    Bitmap    cacheBMP[];
    Bitmap    forGUI;
    boolean   startDraw, exitDraw;

    public TouchView(Context context) {
        super(context);

        cacheBMP = new Bitmap[2];

        hBMP = new Handler() {
            public void handleMessage(android.os.Message msg) {
                forGUI = (Bitmap) msg.obj;
            }
        };

    }

    protected void  onSizeChanged (int w, int h, int oldw, int oldh) {
        for( int i=0; i<2; i++ )
            cacheBMP[i] = Bitmap.createBitmap(w*2, h*2, Bitmap.Config.ARGB_8888);

        useBMP=0;
	forGUI=cacheBMP[0];
        startDraw = true;
    }

    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();

        exitDraw = false;
        new Thread(new Runnable() {
            public void run() {  drawThread();  }
        }).start();
    }

    @Override
    protected void onDetachedFromWindow() {
        exitDraw = true;

        super.onDetachedFromWindow();
    }

    void drawThread() {
        Message msg;
        while( !exitDraw ) {
            if( startDraw ) {
                startDraw = false;

                if( useBMP==0 )  useBMP=1;
                else             useBMP=0;

                drawBMP(useBMP);

                msg = hBMP.obtainMessage(0,cacheBMP[useBMP]);
                hBMP.sendMessage(msg);
                postInvalidate();
            }

            try {
                TimeUnit.MILLISECONDS.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    void drawBMP(int n) {
        cacheBMP[n].eraseColor(Color.WHITE);
        Canvas canvas = new Canvas(cacheBMP[n]);
      .....
    }

    public void redraw() {
        startDraw = true;
    }

    @Override
    protected void onDraw(Canvas c) {
                c.drawBitmap(forGUI,0,0,p);
    }
}

...
Рейтинг: 0 / 0
25.04.2015, 11:51
    #38945165
Петровичч
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Android 5 multithreading
Тормоза уходят если создавать битмапы RGB_565.
Это не решение, но говорит о том что проблема в битмапах а не в многопоточности.
...
Рейтинг: 0 / 0
Форумы / Android [игнор отключен] [закрыт для гостей] / Android 5 multithreading / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]