Click here to Skip to main content
11,715,491 members (80,178 online)
Rate this: bad
good
Please Sign up or sign in to vote.
See more: Java Android
I wrote a lot of code for graphical remote control via mobile, my app uses SurfaceView, canvas and sockets, but I got 2 errors:
1)Application crashing when I click Home button.
2)Application crashing when I change device orientation.
Could you point me right direction? Please help.

EDIT: second problem solvedSmile | :)

package com.example;
 
import android.app.Activity;
import android.content.Context;
import android.graphics.*;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
 
import java.util.ArrayList;
 
public class MyActivity extends Activity {
    /**
     * Called when the activity is first created.
     */
    public boolean _run = false;
    Panel pnl;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.main);
        pnl = new Panel(this);
        setContentView(pnl);
    }
    class Panel extends SurfaceView implements SurfaceHolder.Callback {
        private TutorialThread _thread;
 
        public Panel(Context context) {
            super(context);
            getHolder().addCallback(this);
            _thread = new TutorialThread(getHolder(), this);
            setFocusable(true);
        }
 
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            synchronized (_thread.getSurfaceHolder()) {
                if (event.getAction() == MotionEvent.ACTION_MOVE) {
                }
                if (event.getAction() == MotionEvent.ACTION_DOWN) {
                }
                if (event.getAction() == MotionEvent.ACTION_UP) {
                }
                return true;
            }
        }
 
        @Override
        public void onDraw(Canvas canvas) {
            canvas.drawColor(Color.BLACK);
            Paint mPaint = new Paint();
            //int color = 0xaf000000;
            mPaint.setColor(Color.WHITE);
            mPaint.setStrokeWidth(2);
            canvas.drawText("something", 50, 50, mPaint);
        }
 
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            // TODO Auto-generated method stub
        }
 
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            _thread.setRunning(true);
            _thread.start();
        }
 
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            // simply copied from sample application LunarLander:
            // we have to tell thread to shut down & wait for it to finish, or else
            // it might touch the Surface after we return and explode
            boolean retry = true;
            _thread.setRunning(false);
            while (retry) {
                try {
                    _thread.join();
                    retry = false;
                } catch (InterruptedException e) {
                    // we will try it again and again...
                }
            }
        }
    }
    class TutorialThread extends Thread {
        private SurfaceHolder _surfaceHolder;
        private Panel _panel;
        //public boolean _run = false;

        public TutorialThread(SurfaceHolder surfaceHolder, Panel panel) {
            _surfaceHolder = surfaceHolder;
            _panel = panel;
        }
 
        public void setRunning(boolean run) {
            _run = run;
        }
 
        public SurfaceHolder getSurfaceHolder() {
            return _surfaceHolder;
        }
 
        @Override
        public void run() {
            Canvas c;
            while (_run) {
                try{
                    Thread.sleep(100);
                }catch(Exception x){}
                c = null;
                try {
                    //if(drawn == false)
                    {
                        //]drawn = true;
                        try{
                        c = _surfaceHolder.lockCanvas(null);
                        synchronized (_surfaceHolder) {
                            _panel.onDraw(c);
                        }
                        }catch (Exception cc)
                        {
                            cc.toString();
                        }
                    }
                } finally {
                    // do this in a finally so that if an exception is thrown
                    // during the above, we don't leave the Surface in an
                    // inconsistent state
                    if (c != null) {
                        _surfaceHolder.unlockCanvasAndPost(c);
                    }
                }
                //catch (Exception cx)
                  //      {}
            }
        }
    }
}
Manifest:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example"
          android:versionCode="1"
          android:versionName="1.0">
    <uses-sdk android:minSdkVersion="8"/>
    <application android:label="@string/app_name" android:icon="@drawable/ic_launcher">
        <activity android:name="MyActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>
</manifest>
From LogCat:
java.lang.IllegalThreadStateException: Thread already started.
How to fix? Please help!
Posted 12-Jan-13 7:31am
halabella1.3K
Edited 14-Jan-13 3:31am
v8
Comments
Sandeep Mewara at 12-Jan-13 15:09pm
   
How come anyone would even comment on it without seeing what code you have written around 'home' button.
halabella at 12-Jan-13 15:27pm
   
Attached source.
ridoy at 13-Jan-13 1:23am
   
Please show LogCat view here,for which reason you app crashing.
halabella at 14-Jan-13 9:32am
   
Added LogCat results.
halabella at 13-Jan-13 7:40am
   
How to set LogCat? I'm using Intellij IDEA.
Rate this: bad
good
Please Sign up or sign in to vote.

Solution 1

whats your manifest look like? do you mean home as in your main menu or home as in androids home screen? make sure your launcher is defined.
  Permalink  
Comments
halabella at 13-Jan-13 7:38am
   
Attached manifest if its matter. 'Home' in android emulator, not in my app menu.
analogx at 4-Feb-13 9:50am
   
one more thing can you post your solution so that others can benefit from it...
Rate this: bad
good
Please Sign up or sign in to vote.

Solution 2

Thanks to all, I solved it myself by inserting one line of code.
  Permalink  
v2

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

  Print Answers RSS
0 Sergey Alexandrovich Kryukov 495
1 Richard MacCutchan 275
2 Maciej Los 259
3 ManasKumarM 155
4 Frankie-C 125
0 Sergey Alexandrovich Kryukov 785
1 CHill60 415
2 Richard MacCutchan 405
3 Maciej Los 389
4 OriginalGriff 320


Advertise | Privacy | Mobile
Web03 | 2.8.150901.1 | Last Updated 14 Jan 2013
Copyright © CodeProject, 1999-2015
All Rights Reserved. Terms of Service
Layout: fixed | fluid

CodeProject, 503-250 Ferrand Drive Toronto Ontario, M3C 3G8 Canada +1 416-849-8900 x 100