아래와 같이 리사이클러뷰 어댑터의 onBindViewHolder에서 공공데이터포털의 오픈 API를 연동하였습니다.
새로운 프로젝트를 만들어 똑같은 코드를 사용했을 때는 별 문제 없이 결과값이 나왔지만 onBindViewHolder에서 사용하니 try catch의 예외문으로 null값이 나옵니다.
이유가 뭔지 아시는 고수분 계신가요?
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
holder.tv1.setText(mList.get(position).getStationNm());
holder.tv_routId.setText(mList.get(position).getBusRouteId());
holder.tv_seq.setText(mList.get(position).getSeq());
busRouteId = mList.get(position).getBusRouteId();
ord = mList.get(position).getSeq();
holder.tv_routId.setText(busRouteId);
holder.tv_seq.setText(ord);
holder.tv3.setText(mList.get(position).getPlainNo());
requestUrl = "http://ws.bus.go.kr/api/rest/buspos/getLowBusPosByRouteSt?serviceKey="+dataKey+"&busRouteId=100100110&startOrd="+ord+"&endOrd="+ord;
//"http://ws.bus.go.kr/api/rest/buspos/getBusPosByVehId?serviceKey=GiR2P0nFPyFyEt8y0fqQfpnAAr7tB9E%2BGV1rMbymFB4Y4CsNI5gON%2FVDs31BSgFwUUvqRVIvgXEKOUScetLEuQ%3D%3D&vehId=113062100";
// http://ws.bus.go.kr/api/rest/buspos/getLowBusPosByRouteSt?serviceKey=GiR2P0nFPyFyEt8y0fqQfpnAAr7tB9E%2BGV1rMbymFB4Y4CsNI5gON%2FVDs31BSgFwUUvqRVIvgXEKOUScetLEuQ%3D%3D&busRouteId=100100110&startOrd=1&endOrd=75;
try{
boolean b_item = false;
boolean b_plainNo = false;
boolean b_vehId = false;
boolean b_stopFlag = false;
boolean b_busType = false;
boolean b_lastStnId = false;
boolean b_congetion = false;
URL url = new URL(requestUrl); //검색 URL부분
InputStream is = url.openStream();
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser parser = factory.newPullParser();
parser.setInput(new InputStreamReader(is, "UTF-8"));
int parserEvent = parser.getEventType();
System.out.println("파싱시작합니다.");
while (parserEvent != XmlPullParser.END_DOCUMENT){
switch(parserEvent){
case XmlPullParser.START_TAG://parser가 시작 태그를 만나면 실행
if(parser.getName().equals("plainNo")){ //title 만나면 내용을 받을수 있게 하자
b_plainNo = true;
}
if(parser.getName().equals("vehId")){
b_vehId = true;
}
if(parser.getName().equals("stopFlag")){
b_stopFlag = true;
}
if(parser.getName().equals("busType")){
b_busType = true;
}
if(parser.getName().equals("lastStnId")){
b_lastStnId = true;
}
if(parser.getName().equals("congetion")){
b_congetion = true;
}
if(parser.getName().equals("message")){ //message 태그를 만나면 에러 출력
holder.tv2.setText(holder.tv2.getText()+"에러");
//여기에 에러코드에 따라 다른 메세지를 출력하도록 할 수 있다.
}
break;
case XmlPullParser.TEXT://parser가 내용에 접근했을때
if(b_plainNo){
plainNo = parser.getText();
b_plainNo = false;
}
if(b_vehId){ vehId = parser.getText();
b_vehId = false;
}
if(b_stopFlag){
stopFlag = parser.getText();
b_stopFlag = false;
}
if(b_busType){
busType = parser.getText();
b_busType = false;
}
if(b_lastStnId){
lastStnId = parser.getText();
b_lastStnId = false;
}
if(b_congetion){
congetion = parser.getText();
b_congetion = false;
}
break;
case XmlPullParser.END_TAG:
if(parser.getName().equals("itemList")){
//holder.tv2.setText(holder.tv2.getText()+"주소 : "+ plainNo +"\n 충전기 타입: "+ vehId +"\n 충전소ID : " + stopFlag
// +"\n 충전기 명칭 : " + busType + "\n 충전기 상태 코드 : " + lastStnId+ "\n 충전 방식 : " + congetion + "\n");
holder.tv2.setText("나이스~!~!: "+plainNo);
b_item = false;
}
break;
}
parserEvent = parser.next();
}
} catch(Exception e){
holder.tv2.setText("에러가..났습니다..." + e.getMessage());
System.out.println("tryError :" + e.getMessage());
}
}