안드로이드 개발 질문/답변
(글 수 45,052)
안녕하세요..
현재 FTP서버 접속을 통해서
FTP 서버내 리스트들을 출력하는 프로그램을 만들고 있습니다만..
리스트뷰를 통해서 출력하려고 하니 커스텀환경이 구성되지 않아
커스텀뷰를 통해서 xml을 구성하였는데..
문제는 파일 리스트 출력 부분에 있어서
초기에 배열에 리스트들을 저장할 크기를 지정해주어야 하는데
그 크기가 정확하게 현재 FTP 서버내에 있는 개수와 동일해야만
오류가 발생하지 않는다는 것입니다.
가령 FTP 서버내 현재 파일의 개수가 5개일 경우
정확하게 5개의 배열을 미리 선언해놓고 커스텀뷰에 아이템을 넘겨주어야만
오류가 발생하지 않는다는 것입니다.
그러면, 파일의 개수를 현재 FTP 파일의 length 를 구해서 그 크기만큼 할당해주면 되지 않느냐
하실수 있는데, 기본적으로 FTP 서버 접속 자체가 try~catch 문으로 이루어져 있기 때문에
FTP서버접속후에 리스트를 초기화하면 오류가 발생하게 되어버립니다.
따라서 현재로서는 굉장히 안타깝게도 마땅한 방도를 찾지 못하고 있는 실정입니다.
여기 계신분들은 워낙 날고 기시는 분들이 많으시니 제가 무엇을 말하는지 알고 계실겁니다.
아래 소스를 보여드리겠습니다.
public class DownloadActivity extends ListActivity{
TextView tv;
String [] items;
String fileName [];
FTPFile[] files;
String Server;
String ID;
String PassWord;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.download);
Intent intent=getIntent(); //인텐트를 통해 각각의 값들을 받아옴
String Server =intent.getStringExtra("data_ServerAddress"); //서버이름
String ID =intent.getStringExtra("data_ID"); //ID
String PassWord =intent.getStringExtra("data_PassWord"); //패스워드
String TimeOut =intent.getStringExtra("data_TimeOut"); //타임아웃
try{
FTPClient con = new FTPClient();
con.connect(Server, 21);//서버접속
con.login(ID, PassWord);
con.enterLocalPassiveMode(); //패시브모드로 전환합니다.
con.setFileType(con.BINARY_FILE_TYPE); //파일형식을 이진파일 형식으로 설정합니다.
con.changeWorkingDirectory("/");
FTPFile[] files=con.listFiles();
String []items=new String[5];//문제가 되는부분
String []fileName=new String[5];
for(int i=0; i<(files.length)-1; i++){
String fileSize;
if(files[i].getSize()>=1000000)
fileSize=String.format("%.1f",Double.valueOf(((double)(files[i].getSize())/((double)(1048576))) ))+"MB";
else if(files[i].getSize()>=1000)
fileSize=String.format("%.1f",Double.valueOf(((double)files[i].getSize())/((double)(1024))))+"KB";
else
fileSize=Long.toString(files[i].getSize())+"bytes";
fileName[i]=files[i].getName().toString()+" "+fileSize;
//test.append(fileName[i]+"\n");
items[i]=fileName[i];
}
}catch (Exception e) //예외처리
{
e.printStackTrace();
}
ArrayAdapter<String>aa=new ArrayAdapter<String>(DownloadActivity.this,R.layout.downloadrow,R.id.label,items);
setListAdapter(aa);
tv=(TextView)findViewById(R.id.selection);
}
public void onListItemClick(ListView l,View v,int position, long id){
}
}
String [] items;
String fileName [];
FTPFile[] files;
String Server;
String ID;
String PassWord;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.download);
Intent intent=getIntent(); //인텐트를 통해 각각의 값들을 받아옴
String Server =intent.getStringExtra("data_ServerAddress"); //서버이름
String ID =intent.getStringExtra("data_ID"); //ID
String PassWord =intent.getStringExtra("data_PassWord"); //패스워드
String TimeOut =intent.getStringExtra("data_TimeOut"); //타임아웃
try{
FTPClient con = new FTPClient();
con.connect(Server, 21);//서버접속
con.login(ID, PassWord);
con.enterLocalPassiveMode(); //패시브모드로 전환합니다.
con.setFileType(con.BINARY_FILE_TYPE); //파일형식을 이진파일 형식으로 설정합니다.
con.changeWorkingDirectory("/");
FTPFile[] files=con.listFiles();
String []items=new String[5];//문제가 되는부분
String []fileName=new String[5];
for(int i=0; i<(files.length)-1; i++){
String fileSize;
if(files[i].getSize()>=1000000)
fileSize=String.format("%.1f",Double.valueOf(((double)(files[i].getSize())/((double)(1048576))) ))+"MB";
else if(files[i].getSize()>=1000)
fileSize=String.format("%.1f",Double.valueOf(((double)files[i].getSize())/((double)(1024))))+"KB";
else
fileSize=Long.toString(files[i].getSize())+"bytes";
fileName[i]=files[i].getName().toString()+" "+fileSize;
//test.append(fileName[i]+"\n");
items[i]=fileName[i];
}
}catch (Exception e) //예외처리
{
e.printStackTrace();
}
ArrayAdapter<String>aa=new ArrayAdapter<String>(DownloadActivity.this,R.layout.downloadrow,R.id.label,items);
setListAdapter(aa);
tv=(TextView)findViewById(R.id.selection);
}
public void onListItemClick(ListView l,View v,int position, long id){
}
}
현재 해당 FTP에 파일 목록의 개수가 5개 입니다. 위의 빨간줄에서 배열을 5개 혹은 이하를 만들어주면
오류가 발생하지 않지만 배열의 개수를 6개 혹은 10개 등 5개 초과시에는 여지 없이 오류가 발생해 버립니다.
대체 이 난관을 어찌해쳐나가야할지 여기 계신분들은 꼭 해결해주시리라 믿습니닷!




배열 대신에 ArrayList 자료구조를 써보세요.