총 게시물 39,104건, 최근 2 건 안내 RSS 글쓰기
이전글  다음글  목록 글쓰기
[안드로이드]

시작하는데 14초나 걸리네요. 이유가 뭘까요?

글쓴이 : 안드촘 날짜 : 2018-01-08 (월) 22:13 조회 : 2463
글주소 : http://www.androidside.com/B49/169083
 
  서울게임아카데미
추천JAVA, 2017년 한국 소비자만족지수 1위, 고용노동부국비지원, 수강료조회
www.seoulgame.co.kr
  KGITBANK학원 김종수
상담예약접수처, 중고등학생수시대비, 대학전공, 국비지원취업, 정보보안전문가학원.
www.hrditbank.co.kr
  아마존 AWS 1년 무료체험
AWS 클라우드로 개발하는 JAVA, 유동적인 리소스 관리, 편리한 배포, 디버깅
aws.amazon.com/ko/
신청하기


안드로이드, 자바 그리고 다양한 질문에 대해 성실히 답해드립니다. Q&A Jang

다음과 같이 같단한 앱을 짰는데요. 위쪽에 있는 텍스트뷰에 숫자를 입력하면

그아래에 공식에 의한 계산결과가 나오고,

그 아래에 그 결과를 계기판 바늘같은 형식으로 보여주는 건데요.

코딩 초보라서... 

빨리 실행되게 하는 방법이 뭐가 있을까요?

<<<<< MainActivity.java >>>>>

import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {
    EditText mWeightEditText;
    EditText mHeightEditText;
    TextView mBmiTextView;
    float floatWeight;
    float floatHeight;
    static float floatBmi = 0f;
    String strBmi;

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

        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

        mWeightEditText = (EditText)findViewById(R.id.weightEditText);
        mHeightEditText = (EditText)findViewById(R.id.heightEditText);
        mBmiTextView = (TextView)findViewById(R.id.bmiTextView);

        mWeightEditText.addTextChangedListener(mWatcher);
        mHeightEditText.addTextChangedListener(mWatcher);
    }

    TextWatcher mWatcher = new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
            if (   ( mWeightEditText.getText().toString().length()>0 )   &&   ( mHeightEditText.getText().toString().length()>0 )   ) {
                if ( mHeightEditText.getText().toString().equals("0") ) {

                } else {
                    floatWeight = Float.parseFloat(mWeightEditText.getText().toString());
                    floatHeight = Float.parseFloat(mHeightEditText.getText().toString());

                    floatBmi = (floatWeight / (floatHeight/100f)) / (floatHeight/100f);
                    strBmi = String.format("%.1f", floatBmi);

                    mBmiTextView.setText(strBmi);

                }
            } else {
                mBmiTextView.setText("");
                floatBmi = 0f;
            }
        }

        @Override
        public void afterTextChanged(Editable editable) {}
    };
}
=============================================================================
<<<<< BmiView.java >>>>>

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class BmiView extends SurfaceView implements SurfaceHolder.Callback {
    Context mContext;
    SurfaceHolder mHolder;
    BmiThread mThread;

    int screenWidth;
    int screenHeight;
    int radius;
    int xOfCenterOfCircle;
    int yOfCenterOfCircle;
    int tOfRectOfArc;
    int bOfRectOfArc;
    int lOfRectOfArc;
    int rOfRectOfArc;
    int xOfNeedleEnd = 0;
    int yOfNeedleEnd = 0;
    int intBmi;

    RectF rect;

    Paint mPaintGreen;
    Paint mPaintBlack;
    Paint mPaintNeedle;

    // constructor
    public BmiView(Context context, AttributeSet attrs) {
        super(context, attrs);
        SurfaceHolder holder = getHolder();
        holder.addCallback(this);

        mHolder = holder; // 생성한 holder를 전역변수에 저장
        mContext = context; // 인수로 넘겨온 context를 전역변수에 저장
        mThread = new BmiThread(); // GameThread생성

        mPaintGreen = new Paint();
        mPaintBlack = new Paint();
        mPaintNeedle = new Paint();
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);

        screenWidth = w;
        screenHeight = h;

        if ( h > w/2 ) {
            radius = w*4/10;
        } else {
            radius = h*4/5;
        }
        xOfCenterOfCircle = w/2;
        yOfCenterOfCircle = h*4/5;

        tOfRectOfArc = yOfCenterOfCircle - radius;
        bOfRectOfArc = yOfCenterOfCircle + radius;
        lOfRectOfArc = xOfCenterOfCircle - radius;
        rOfRectOfArc = xOfCenterOfCircle + radius;

        mPaintGreen.setColor(Color.GREEN);
        mPaintBlack.setColor(Color.BLACK);
        mPaintNeedle.setColor(Color.RED);
        mPaintNeedle.setStrokeWidth(10);

        rect = new RectF();
    }

    @Override
    public void surfaceCreated(SurfaceHolder surfaceHolder) {
        mThread.start();
    }

    @Override
    public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) { }

    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) { }

    class BmiThread extends Thread {
        Bitmap imgBack;

        // constructor
        public BmiThread() {
        }

        public void run() {

            Canvas canvas = null;  
            while (true) {
                canvas = mHolder.lockCanvas();
                try {
                    synchronized (mHolder) {   // 동기화 유지
                        canvas.drawColor(Color.WHITE);
                        rect.set(lOfRectOfArc, tOfRectOfArc, rOfRectOfArc, bOfRectOfArc);
                        canvas.drawArc(rect, 180, 180, false, mPaintGreen);

                        intBmi = (int)MainActivity.floatBmi;
                        if(intBmi > 40) {
                            intBmi = 40;
                        }

                        double deg = 180*(intBmi/40d), rad;
                        rad = Math.toRadians(deg);

                        xOfNeedleEnd = xOfCenterOfCircle - (int)((  Math.cos(rad) )*radius);
                        yOfNeedleEnd = yOfCenterOfCircle - (int)((  Math.sin(rad) )*radius);

                        canvas.drawLine(xOfCenterOfCircle, yOfCenterOfCircle, xOfNeedleEnd, yOfNeedleEnd, mPaintNeedle);

                        canvas.drawCircle(xOfCenterOfCircle, yOfCenterOfCircle, 10, mPaintBlack);

                    }
                } finally {
                    mHolder.unlockCanvasAndPost(canvas);
                }
            } // end of while()
        } // end of run()
    } // 스레드 끝
}

=============================================================================
<?xml version="1.0" encoding="utf-8"?>

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="comp.whcomp.whteam.bmicalcu.MainActivity"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="4"
        android:orientation="vertical">

        <EditText
            android:id="@+id/heightEditText"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:ems="10"
            android:inputType="number|numberDecimal"
            android:maxLength="5" />

        <EditText
            android:id="@+id/weightEditText"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:ems="10"
            android:inputType="number|numberDecimal"
            android:maxLength="5" />

        <TextView
            android:id="@+id/bmiTextView"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:ems="10"
            android:inputType="textPersonName" />

    </LinearLayout>

    <comp.whcomp.whteam.bmicalcu.BmiView
        android:id="@+id/BmiView2"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="5" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="6"
        android:orientation="horizontal"></LinearLayout>

</LinearLayout>




질문자가 자신의 포인트 5 점을 걸었습니다.
답변하시면 포인트 2을, 답변이 채택되면 포인트 4을 드립니다.

질문답변 게시판에서 궁금한 사항을 해결하셨다면, 애써 답변해주신 분께 잘 되었다고 따뜻한 댓글 한마디 남겨주세요.
그리고 답변해주신 분의 글을 '추천' 해주세요.
추천받으신 분에게 1포인트가, 추천하신 분에게도 1포인트가 적립됩니다. ^^

OSKiller 2018-01-09 (화) 08:39 추천추천 1 반대 0
로그 찍어서 어디서 시간을 많이 잡아 먹는지 확인 하셨나요?
코드 분석은 귀찮아서 안했습니다.
안사 이쁜이 2018-01-08 (월) 22:13
축하드립니다. ;)
안드촘님은 안사 이쁜이에 당첨되어 2 포인트 지급되었습니다.
OSKiller 2018-01-09 (화) 08:39
베플로 선택된 게시물입니다.
로그 찍어서 어디서 시간을 많이 잡아 먹는지 확인 하셨나요?
코드 분석은 귀찮아서 안했습니다.
댓글주소 추천 1 반대 0
     
     
안드촘 2018-01-09 (화) 12:21

[@OSKiller]

해보겠습니다.  이런 경우에 어떻게 해야하는지 몰라서 질문했습니다.

알려주셔서 감사합니다.

댓글주소 추천 0 반대 0
에찌 2018-01-10 (수) 10:05
현재 소스상으로만 보면 쓰레드부분이라고 짐작이 가는데 쓰레드 동작하기전 로그와 쓰레드 동작 후 로그를 찍어보시고
맞다면 범위를 축소시키면서 로그를 찍어보세요 그럼 어느 한부분에서 확실히 시간을 잡아먹을 듯 합니다.
댓글주소 추천 0 반대 0
이전글  다음글  목록 글쓰기

 


Copyright ⓒ www.androidside.com. All rights reserved.
채팅 권한: 글쓰기 1개
2레벨 이상만 대화 가능
공개 채팅: 평일 !(9시 ~ 17시),토,일
안사2 변경사항 보러가기 챗방이 잘 안보이면 크롬에서 접속해주세요
챗방 숨기기 |  챗방 보이기