안녕하세요. 초보 개발자 입니다.
현재 while 문을 이용하여 shell 에서 http패킷을 BufferedReader.readline 으로 나온 Text를 Textview에 표시하는 프로그램 개발중 입니다.
여기서 문제가 앱을 실행시키고 종료시키지 않고 홈버튼을 누르고 내려놓은 다음에 웹을 실행시켜 패킷을 수집한 후 다시 앱을 실행시키면 Text의 양이 많을수록 검은화면에서 굉장히 오랜시간을 기다려야 앱이 실행되면서 텍스트가 보입니다.
텍스트가 logcat 에서는 빠르게 올라가기 때문에 많은 양임을 알수가 있는데
그 양이 한번에 텍스트뷰에 그리려다 보니까 시간이 오래 걸리는것으로 생각됩니다.
TextView mTcptv;
Handler handler;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTcptv = (TextView) findViewById(R.id.log_tv);
mTcptv.setMovementMethod(new ScrollingMovementMethod());
startWrite();
}
private void startWrite()
{
thread = new Thread(new Runnable()
{
public void run()
{
writePacket();
}
});
thread.start();
}
private void writePacket(){
String temp = new String();
Message msg;
try {
......
중간 생략
.......
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
FileOutputStream fos = new FileOutputStream(dumpedFile);
while (!thread.interrupted()) {
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());
msg = handler.obtainMessage();
msg.obj = (Object) temp;
handler.sendMessage(msg);
runOnUiThread(new Runnable() {
@Override
public void run() {
handler = new Handler() {
public void handleMessage(Message msg) {
super.handleMessage(msg);
mTcptv.append((String) msg.obj + "\n");
}
};
}
});
}
}
} catch (Exception e) {
Log.e("Process Manager", "Unable to execute top command");
e.printStackTrace();
}
} |
위 코드입니다..
해결 하고 싶은것은 이 앱을 홈버튼으로 밑으로 내려놓고 패킷을 수집한후에 앱이 돌아가도
오랜시간을 기다리지 않고 바로 텍스트가 뜨게 하고 싶습니다.
코드 상에서 RunOnUiThread 부분의 코드를 변경해야 할 것 같은데 어떻게 해야 해결되는지 알고싶습니다..
아마 그러기 위해서는 화면이 내려간 상태에서도 계속적으로 텍스트뷰에 쓰고 있어야 할텐데
방법을 모르겠습니다.. 위에 코드도 많이 생각해서 runOnUiThread 를 사용한 것입니다..
다른 방법이 있다면 무지한 저에게 알려주시면 감사하겠습니다.