Autore Topic: Black screen in activity con canvas dopo il il ritorno da un'altra activity  (Letto 613 volte)

Offline c4lc4ll

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    ZTE Blade
  • Sistema operativo:
    Debian Squeeze
Ciao a tutti! Ormai ci ho provato in tutti i modi ma non riesco a risolvere. Vi espongo il problema:
In pratica da un'activity dove tra le altre cose (botton ecc ecc) c'e` un canvas mostrante una forma d'onda (continuamente ridisegnato da un thread) richiamo un'altra activity per fare delle cose ma .... alla prima activity trovo lo schermo nero! Non capisco come mai il tutto funziona se "estrometto" il canvas mentre con il canvas mi rimane lo schermo nero! C'e` qualcosa di particolare da mettere in caso di canvas in una activity?

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Black screen in activity con canvas dopo il il ritorno da un'altra activity
« Risposta #1 il: 11 Novembre 2011, 16:36:14 CET »
0
Senza codice è veramente come tirare al bersaglio con gli occhi bendati  :-P , ma volendo tirare ad indovinare probabilmente non gestisci bene la surfaceview e il thread nella onResume dell'activity primaria.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline c4lc4ll

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    ZTE Blade
  • Sistema operativo:
    Debian Squeeze
Re:Black screen in activity con canvas dopo il il ritorno da un'altra activity
« Risposta #2 il: 11 Novembre 2011, 16:54:16 CET »
0
Tutto il codice sarebbe immenso, ecco dei stralci della parte piu` salienti:

Canvas
Codice (Java): [Seleziona]
public class ECG_View extends SurfaceView implements SurfaceHolder.Callback{
       
        private static String TAG="canvas";
        private ECG_PlotThread plot_thread;
       
        private final int width = 352;
        private final int heigth = 283;
       
        private static short[] lead;
        private int start, end, pad;
        private short zero;
        private Paint ch_color = new Paint();
        private Paint grid_paint = new Paint();
        private Paint cross_paint = new Paint();
        private Paint outline_paint = new Paint();
        private Paint waveline_paint = new Paint();
        private int x1,y1,x2,y2;
       
        public ECG_View(Context context, AttributeSet attrs) {  

                super(context, attrs);  
                getHolder().addCallback(this);
                plot_thread = new ECG_PlotThread(getHolder(), this);
                //setFocusable(true);
                ch_color.setColor(Color.RED);
                grid_paint.setColor(Color.rgb(247, 119, 139));
                cross_paint.setColor(Color.rgb(254, 90, 115));
                outline_paint.setColor(Color.RED);
                waveline_paint.setColor(Color.BLACK);
                Settings.getZero();
        }

        public void surfaceChanged(SurfaceHolder holder, int format, int width,
                        int height) {
                // TODO Auto-generated method stub
               
        }

        public void surfaceCreated(SurfaceHolder holder) {
                if (plot_thread.getRunning() == false) {
            Log.d(TAG, "surfaceCreated");                  
            plot_thread.setRunning(true);
           if (plot_thread.isStarted == false) plot_thread.start(); else {
               plot_thread.unPause();
                   plot_thread.run();
           }
           plot_thread.isStarted = true;
                }
        }

        public void surfaceDestroyed(SurfaceHolder holder) {
                boolean retry = true;
                plot_thread.setRunning(false);
                Log.d(TAG, "surfaceDestroyed");
                while (retry) {
                        try {
                                plot_thread.join();
                                retry = false;
                        } catch (InterruptedException e) {
                                // we will try it again and again...
                        }
                }
        }
       
       
        private int getActualVoltage(short data){
                return (int) Math.round(((float)data-(float)zero)*(float)Settings.getPeak_voltage()/((float)Settings.getPeak_data()-(float)Settings.getZero())/(float)Settings.getGain()*(float)1000);
        }
       
        @Override
        public void onDraw(Canvas canvas){
                Draw(canvas);
               
        }
       
       
        public void set_zero(short zero){
                this.zero=zero;
                y1=zero;
        }
       
       
        //aggiungere una variabile di ritorno per vedere se siamo arrivati a fine dei dati o meno
        //0 nessuna anomalia
        //1 limite raggiunto
        //aggiungere una variabile che conta il numero di finestre da visitare
       
        public void set_data(short[] data, boolean window, int window_number){
                plot_thread.setRunning(false);
                int last_data=data.length;
                if (window==true){
                        if (last_data>1000) {
                                end=last_data-1;
                                start=(int) (end-(end%1000));
                        }else{
                                end=last_data-1;
                                start=0;
                        }
                }else{
                        end=last_data-1;
                        if (last_data>1000) {
                                start=last_data-1000;
                        }else{
                                end=last_data-1;
                                start=0;
                        }
                }
                lead=data;
                plot_thread.setRunning(true);
        }
       
        public void Draw(Canvas canvas){
                // clear screen
                canvas.drawColor(Color.rgb(249, 159, 173));
                // draw grids
                DrawGrid(canvas);
                DrawWave(canvas);
                DrawTime(canvas);
                DrawHeartRate(canvas);
        }

}



Thread del canvas
Codice (Java): [Seleziona]
public class ECG_PlotThread extends Thread {
        private static String TAG="Canvas Thread";
        private SurfaceHolder holder;
        private ECG_View plot_area;
        private boolean _run = false;
        boolean isPaused = false;
    boolean isStarted = false;
       
        public ECG_PlotThread(SurfaceHolder surfaceHolder, ECG_View view){
                holder = surfaceHolder;
                plot_area = view;
        }
        public void setRunning(boolean run){
                _run = run;
        }
       
        public boolean getRunning (){
                return _run;
        }
       
        @Override
        public void run(){
                Canvas c;
                Log.d(TAG, "run-pre while");
                while(_run && !isPaused){
                        Log.d(TAG, "run-post while");
                        c = null;
                        try{
                                c = holder.lockCanvas(null);
                                synchronized (holder) {
                                        plot_area.Draw(c);
                                        Log.d(TAG, "run Draw");
                                }
                        }finally{
                                if(c!=null){
                                        holder.unlockCanvasAndPost(c);
                                }
                        }
                }
        }
       
        public void pause() {
        synchronized (holder) {
          isPaused = true;
        }
    }

    public void unPause() {
        synchronized (holder) {
          isPaused = false;
        }              
    }
       
}


Activity principale

Codice (Java): [Seleziona]
public class BluetoothDataAcquisitionActivity extends Activity implements  Button.OnClickListener{
        private static String TAG="BluetoothActivity";
   
       
    public static ECG_View mECG = null;
   
   
   
   
   

   
   
        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                requestWindowFeature(Window.FEATURE_NO_TITLE);
                requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);

                // Set layout
                setContentView(it.polimi.ecg.android.R.layout.acquisition);
               
                Log.d(TAG,"Create");
                mECG = (ECG_View) findViewById(it.polimi.ecg.android.R.id.ecg_view);
        }

        @Override
        public void onStart() {
                super.onStart();
        }
   
       
   
    @Override
    public synchronized void onResume() {
        super.onResume();
        Log.d(TAG,"Resume");
            }
        }
    }
   
               
       
   
       
        public void onPause(){
                super.onPause();
        }
       
        public void onStop(){
                super.onStop();
        }
}


Offline c4lc4ll

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    ZTE Blade
  • Sistema operativo:
    Debian Squeeze
Re:Black screen in activity con canvas dopo il il ritorno da un'altra activity
« Risposta #3 il: 11 Novembre 2011, 17:11:22 CET »
0
Aggiungo che dal logcat viene eseguito tutto correttamente:

11-11 17:10:21.820: D/BluetoothActivity(4068): Create
11-11 17:10:21.860: D/BluetoothActivity(4068): Start
11-11 17:10:33.240: D/BluetoothActivity(4068): Setup Settings
11-11 17:10:33.240: D/BluetoothActivity(4068): Setup Settings OK
11-11 17:10:33.250: D/BluetoothActivity(4068): Exit OnResult
11-11 17:10:33.250: D/BluetoothActivity(4068): Start
11-11 17:10:33.250: D/BluetoothActivity(4068): Resume


Se l'activity chiamata e` in trasparenza allora tutto funziona correttamente ma purtroppo poco si adatta con quello che voglio fare
« Ultima modifica: 11 Novembre 2011, 17:27:06 CET da c4lc4ll »

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Black screen in activity con canvas dopo il il ritorno da un'altra activity
« Risposta #4 il: 11 Novembre 2011, 18:01:56 CET »
0
Tempo fa ho fatto una cosa veramente molto simile. La prima differenza che noto è che io creavo il thread e lo avviavo dentro surfaceCreated e non nel costruttore della View.

Insomma il problema potrebbe essere dover riavviare correttamente il thread (io lo facevo ricreandolo se non era alive all'interno della surfaceCreated).
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline c4lc4ll

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    ZTE Blade
  • Sistema operativo:
    Debian Squeeze
Re:Black screen in activity con canvas dopo il il ritorno da un'altra activity
« Risposta #5 il: 11 Novembre 2011, 21:20:14 CET »
0
Tempo fa ho fatto una cosa veramente molto simile. La prima differenza che noto è che io creavo il thread e lo avviavo dentro surfaceCreated e non nel costruttore della View.

Insomma il problema potrebbe essere dover riavviare correttamente il thread (io lo facevo ricreandolo se non era alive all'interno della surfaceCreated).

Mitico! Non sai quanto tempo ci ho perso ma grazie a te ho risolto! Grazie!!!