마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

화면이 다 로딩이 되면 실행하기..?

0 추천
제가 OnCreate에 블루투스장치와 자동으로 연결하는 루틴을 넣었습니다

그런데 화면이 약 6초정도 한참(까만화면) 있다가 로딩이 됩니다

 

화면이 다 로딩된다음에 다음 작업(블루투스 연결)을 할수 잇게 할수는 없을까요?
헨씀히포 (3,660 포인트) 님이 2014년 2월 13일 질문

1개의 답변

+1 추천

연결하는 작업을 UI Thread에서 진행하여 그런 것입니다.

UI Thread 가 아닌 별도의 Thread에서 블루투스 연결을 시도하시고 결과만 인터페이스를 통하여 받아내면 될 것 같습니다.

하나 주의한 점을 알려드리면

BluetoothAdapter.getDefaultAdapter();

위 메소드로 BluetoothAdapter 를 얻는 작업을 Thread 내부에서 진행하신다면 Looper 부분도 신경써야 합니다.

dante2k (8,390 포인트) 님이 2014년 2월 13일 답변
Timer timer;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
                connectTimerCreate();
       }         

    private void connectTimerCreate(){
        connectTimer = new Timer();
        connectTimer.schedule(new conntectSecond(), 0, 2000);
    }

    class conntectSecond extends TimerTask         {   
        @Override
        public void run()
        {
            connectRunnableUpdate();
        }
    };

    protected void connectRunnableUpdate() {
        Runnable updater = new Runnable()
        {            
            public void run()
            {  
                try {
                    connectCount=0;
                    connectTimer.cancel();
                    SocketConect();
                }catch(Exception e){
                    connectCount++;
                    if(connectCount >= 15){
                        connectTimer.cancel();
                        Toast.makeText(getApplicationContext(), "장치에 연결하는데 실패햇습니다", Toast.LENGTH_SHORT).show();
                        return;
                    }
                }
            }
        };
        handler.post(updater);
    }

위와 같이 햇는데 화면이 너무 늦게 로딩이 됩니다
Timer 자체가 Thread 로 작동하는 것을 기반으로 반복작업을 하기 위한 것인데 다시 안쪽에서 handler.post(runnable); 을 하시는 이유가 있는 건가요?

도움이 될런지 모르겠습니다만.. 코드를 보고 좀 수정해 보았습니다.
connectSocket() 메소드는 5초 딜레이 이후 exception을 던지도록 해놓았으니까요.. 약 10초 후 Toast메시지가 뜨는 것을 보실 수 있구요. MainActivity의 화면은 실행시 바로 보일겁니다.

------------
public class MainActivity extends Activity {

    Timer timer;
    int connectCount = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);

        connectTimerCreate();
    }

    private void connectTimerCreate() {
        timer = new Timer();
        timer.schedule(new conntectSecond(), 0, 2000);
    }

    class conntectSecond extends TimerTask {
        @Override
        public void run() {
            try {
                connectSocket();

            } catch (Exception e) {
                connectCount++;
                if (connectCount >= 2) {
                    failConnect();
                }
            }
        }
    };

    private void connectSocket() throws Exception {
        Log.v("TAG", "connectSocket()");
        // TODO work
        try {
            Thread.sleep(5 * 1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        throw new Exception("연결 실패");
    }

    private void failConnect() {
        timer.cancel();

        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(getApplicationContext(), "장치에 연결하는데 실패햇습니다",
                        Toast.LENGTH_SHORT).show();
            }
        });
    }
}
-----
똑같이 했는데 conntectSecond 가 한번뿐이 실행안됩니다 흐 흐흐
...