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

setText를 한 글자씩 출력하는 메소드 구현중인데, 설정값보다 너무 느립니다.

+1 추천

안녕하세요?

setText를 사용해서 한 번 클릭시 지정된 문자열이 한글자씩 출력되는 기능을 구현하고 있습니다.

메인 UI를 변경해야 하므로 핸들러를 같이 사용해서, substring으로 한 글자씩 잘라서 

sendEmptyMessageDelayed를 통해 100ms당 한 글자씩 출력하는 기능입니다.

그런데 이렇게 하고보니 대략 300ms이하부터는 더 빠르게 출력되게 값을 설정해도

똑같이 느릿느릿하게 출력됩니다. 이게 제가 어떤 코드를 누락시켜서 그런건지, 아니면 

메모리나 다른 부분에 부하가 커서 이정도로밖에 출력되지 않는건지 모르겠습니다.

원래 기능의 목적은 50ms에 한 글자 정도의 속도로 출력해주는게 목적이었습니다.

 

 

public class Play extends Thread{

    final SetHandler setHandler = new SetHandler();
    TextView writeTextView;
    Map<Integer,Line> map = new HashMap<Integer,Line>();
    int playnum = 0;


    Play(Map map, TextView writeTextView,int i){
        this.writeTextView = writeTextView;
        this.map = map;
        playnum = i;

    }


    @Override
    public void run() {

            Line playline = map.get(playnum);
            setHandler.keyNum(playnum,playline,writeTextView);
            playnum++;


    }


Play 클래스입니다.

 사용할 핸들러를 미리 선언해놓고, 텍스트뷰와 Line클래스를 넣는 핸들러의 Keynum메소드를 작동시킵니다.

Line은 제가 문자열 외 여러 정보를 넣어두기 위해 따로 선언한 클래스입니다.

map은 HashMap인데, Integer를 키로 해서 Line을 저장해두는 맵입니다.

public class SetHandler extends Handler {

    private int num = 0;
    private Line line;
    TextView write;
    private int position = 0;

    public void keyNum(int i,Line line,TextView write){

        num = i;
        this.line = line;
        this.write = write;
        Message message = obtainMessage();
       sendMessage(message);


    }
    public void handleMessage(Message msg){
            super.handleMessage(msg);
            write.setText(line.getText().substring(0,++position));
        if(position != line.getText().length()){
            sendEmptyMessageDelayed(0,300);
        }

    }


}

SetHandler 클래스입니다.

sendEmptyMessageDelayed를 통해 300ms당 한번씩 메세지를 보내줍니다.

그리고 write.setText()로 한글자씩 잘라서 출력합니다.

 

ACA (220 포인트) 님이 2016년 10월 31일 질문

1개의 답변

0 추천
asynctask 로 하시는게 더 코드가 간결해보이겠네요

대략 이정도랄까요

new AsyncTask<Object, String, Boolean>() {
    @Override
    protected Boolean doInBackground(Object... objects) {
        Context context = (Context) objects[0];

        String value = "hello world";

        try {
            for (int i = 0; i<value.length(); ++i) {
                publishProgress(value.substring(i, 1));
            }
            Thread.sleep(100);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return true;
    }

    @Override
    protected void onProgressUpdate(String... values) {
        mLog.debug("KEY : " + values[0]);
    }

    @Override
    protected void onPostExecute(Boolean result) {

    }
}.execute(this);
aucd29 (218,390 포인트) 님이 2016년 10월 31일 답변
...