안드로이드 개발 질문/답변
(글 수 45,052)
package se.ks;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.ArrayList;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class boardbody extends Activity implements OnItemClickListener {
String server = "123.123.123.123"; // 서버 ip주소
int port = 9904;
String s="";
String str;
public Socket socket = null;
//public chatThread cThread = null;
public PrintWriter streamOut = null;
public BufferedReader streamIn = null;
String boardlist;
public ArrayList<boarditem> mItems;
public BoardDBAdapter mAdapter;
TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.boardbody);
Intent intent = getIntent();
boardlist = intent.getStringExtra("param1");
connect(server, port);
Toast.makeText(this, "잠시만 기다려주세요.", Toast.LENGTH_LONG).show();
mItems = new ArrayList<boarditem>();
mAdapter = new BoardDBAdapter(this, R.layout.boarddblayout, mItems);
ListView list = (ListView) findViewById(R.id.boardsublist);
list.setAdapter(mAdapter);
list.setOnItemClickListener((OnItemClickListener) this);
mAdapter.notifyDataSetChanged();
}
public void connect(String server, int port) {
try {
socket = new Socket(server, port);
streamOut = new PrintWriter(socket.getOutputStream(), true); // 출력용스트림
streamIn = new BufferedReader(new InputStreamReader(
socket.getInputStream(), "utf-8")); // 입력용 스트림
new Chat_Send_Thread(socket, boardlist).start();
/*cThread = new chatThread();
cThread.start();*/
} catch (Exception e) {
}
}
public class Chat_Send_Thread extends Thread {
Socket socket;
String chat;
public Chat_Send_Thread(Socket socket, String chat) {
this.socket = socket;
this.chat = chat;
}
@Override
public void run() {
try {
// Scanner ki = new Scanner(System.in);
streamOut.println(chat);
streamOut.flush();
} catch (Exception e) {
e.printStackTrace();
}
new Chat_Recive_Thread().start();
}
}
class Chat_Recive_Thread extends Thread {
private boolean flag = false; // 스레드 유지(종료)용 플래그
public void run() {
try {
while (!flag) { // 플래그가 false일경우에 루프
String msgs;
Message msg = new Message();
msg.what = 0;
msgs = streamIn.readLine(); // 서버에서 올 메세지를 기다린다.
msg.obj = msgs;
mHandler.sendMessage(msg); // 핸들러로 메세지 전송
}
} catch (Exception e) {
}
}
}
Handler mHandler = new Handler() { // 스레드에서 메세지를 받을 핸들러.
public void handleMessage(Message msg) {
switch (msg.what) {
case 0: // 채팅 메세지를 받아온다.
s = msg.obj.toString();
String a[] = s.split("[|]+");
mItems.add(new boarditem(a[0],a[1],a[2]));
break;
case 1: // 소켓접속을 끊는다.
try {
socket.close();
socket = null;
} catch (Exception e) {
finish();
}
break;
}
}
};
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
// TODO Auto-generated method stub
}
}
소스 중에 볼더 넣어논 부분에서 mitems.add가 되질 않는거 같습니다. 저위치에서 settext하면 문구들이 나오는데
oncreate 부분에가서 settext하면 문자가 없는걸로 확인됩니다.
boarditem.java 따로 정의 해놧구요. // 필요한 정보들 저장하는 클래스
BoardDBAdapter.java 도 따로 정의해 둿습니다. // 리스트뷰하나에 들어가는 layout정의
도저히 왜그런지 모르겠네요.




질문을 제대로 이해하지 못하겠네요..
일단 아래 소스가 문제가 있네요..
connect() 부분에 의하여 몇 개의 쓰레드가 동작되면서 쓰레드 Chat_Recive_Thread가 동작되면서 아래 코드에 의해서
핸들러 내부의 아래 코드가 수행되는데요..
위의 mItems는 쓰레드 내부의 처리 속도에 따라 null일 수도 있고 아닐 수도 있습니다.
아래 코드처럼 변경하는 것이 좋을 듯합니다.