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

부탁드립니다..service에서 while문으로 텍스트를 broadcastrecieve 에서 받아오고 textview.setText 를 하는데 ANR발생

0 추천

안녕하세요. 초보 개발자 입니다. 질문을 한번 올렸었는데 해결이 되지않아서 다시 올릴게요.

원 질문은 

http://www.masterqna.com/android/69154/%EB%8F%84%EC%99%80%EC%A3%BC%EC%84%B8%EC%9A%94-%E3%85%A0%E3%85%A0%EB%8C%80%EC%9A%A9%EB%9F%89-text%EB%A5%BC-runnable%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-textview%EC%97%90-write-%ED%95%98%EA%B8%B0

위 URL 입니다. 

현재 쓰레드에서 Service 로 변경한 상태인데 홈에서 다시 앱을 실행시 ANR 이 발생합니다.

텍스트 양은 꽤 많습니다. 적을때는 발생하지 않는데 양이 많더라도 ANR 을 발생 안하게 하고 싶습니다.

Intent intent;
Filter filter;
PacketReceiver packetReceiver;
TextView textview;
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        intent = new Intent(MainActivity.this, PacketService.class);
        filter = new IntentFilter("broad");
        mTcptv = (TextView) findViewById(R.id.log_tv);
        packetReceiver = new PacketReceiver();
        mStartBtn = (Button) findViewById(R.id.start_btn);

        mStartBtn.setOnClickListener(new View.OnClickListener() {
            boolean flag = false;
            @Override
            public void onClick(View v) {
                flag = !flag;
                if (flag) {
                    startService(intent);
                    registerReceiver(packetReceiver, filter);
                    Log.d("isServiceRunning--",String.valueOf(isServiceRunningCheck()));
                } else {
                    stopService(intent);
                }
            }
        });

  public class PacketReceiver extends BroadcastReceiver{
        public PacketReceiver() {
            super();
        }

        @Override
        public IBinder peekService(Context myContext, Intent service) {
            return super.peekService(myContext, service);
        }

        @Override
        public void onReceive(Context context, Intent intent) {
            Log.d("Broadcast--","reciever");
            String packetStr = intent.getStringExtra("http");
            mTcptv.setMovementMethod(new ScrollingMovementMethod());
            mTcptv.append(packetStr+"\n");
        }
    }
    }

위는 메인과 리시버 이고

public class PacketService extends IntentService {
    DataOutputStream os;
    String temp;
    File dumpedFile;
    public PacketService() {
        super("PacketService");
    }
    @Override
    protected void onHandleIntent(Intent intent) {
        Log.d("service","start");
        writePacket();
    }
private void writePacket() {

        try {
            /
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            temp = new String();

            Intent broadcastIntent = new Intent();
            while (!Thread.interrupted()) {
//                Log.d("whild", "no while");
                temp = reader.readLine();
                if (temp != null) {
                    Log.e("READER", new String(temp));
                    fos.write(temp.getBytes());
                    if (temp.matches("\r"))
                        fos.write("\r\n".getBytes());

                    broadcastIntent.setAction("broad");
                    broadcastIntent.putExtra("http", temp);
                    sendBroadcast(broadcastIntent);
                }
            }
        } catch (Exception e) {
            Log.e("Process Manager", "Unable to execute top command");
            e.printStackTrace();
        }

위는 서비스 입니다.

홈화면에서 다시 앱을 실행시킬시에 ANR이 안나게 하는방법이 무엇이 있을까요...

 

헐잘생겼다 (570 포인트) 님이 2016년 10월 12일 질문

2개의 답변

0 추천
 
채택된 답변
자답입니다.

 

개발꾼님이 말씀 하셨던거 다 적용해서 1차로 빨라졌고

 

가장 중요한것이 텍스트뷰가 아닌 RecyclerView 로 바꾸니까

 

기대하던 속도가 나왔습니다.

 

개발꾼님 좋은 의견 감사드립니다.
헐잘생겼다 (570 포인트) 님이 2016년 10월 13일 답변
0 추천
답변드렸던 분이군요.

sendBroadcast로 하지 마시고

PendingIntent로 해보시겠어요?

그리고 Activity에서 BroadcastReceiver를 regist 하는 부분이 없네요.

ex)

PendingIntent broadcastPending = PendingIntent.getBroadcast ~

broadcastPending.send();
Development Guy (70,570 포인트) 님이 2016년 10월 12일 답변
매번 감사합니다. PendingIntent 해보겠습니다
그리고 onClick 부분에 레지스트 하는부분 위에 있는데
맞는건가요?
registerReceiver(packetReceiver, filter);
broadcastIntent.setAction("broad");
                    broadcastIntent.putExtra("http", temp);
                    PendingIntent sender = PendingIntent.getBroadcast(this, 0,broadcastIntent, PendingIntent.FLAG_ONE_SHOT);
                    sender.send();

서비스 클래스에서 sendBroadCast 부분만 위와같이 바꿔봤습니다.

전보단 ANR이 적은것 같은데 100% 없진 않네요.

예를들면 카톡 단체방에서 글이 어마무시하게 쌓여있어도 그 방을 들어갔을때
ANR이 걸리지 않고 글이 쫘르륵 써져 있는것같은 효과를 원했었는데
그 방법과는 다른 방법인가보네요
혹시 디버깅으로 실행중이신거면 usb케이블을 제거하고 확인 해보세용.
네 제거하니 거기서 또 조~금 빨라졌긴한데
기대한 속도는 나오지 않고 있습니다.
혹시 Service 에서 메인에 있는 TextView를 textview.settext 를 할수도 있나요?
TextView 가 아닌 다른 View 로 시도 해봐야 겠다는 생각이 드네요..
...