XML 방식으로 연동하기 위해서 구글링을 하고 테스트를 하고 적어둔다.
아직 ListView 처리 부분을 명확하게 이해하지 못해서 처리내역이 좀 어설퍼 보인다.
PHP 서버 파트는 http://link2me.tistory.com/1022 게시물을 참조하면 된다.
XML 데이터를 생성하는 부분도 추가해서 게시물을 보강했다.
XML 데이터 포멧은 위와 같다.
XML 데이터는 Local 에 있는 경우와 서버에 있는 경우 둘 다 테스트를 해봤다.
그래서 두가지 경우를 모두 하나의 파일로 만든 걸 적어둔다.
XML 파일은 res 폴더 하단에 만들어서 파일을 추가했다.
테스트에 사용한 파일 첨부
1. Activity_main.xml 파일 내용
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.myxml.MainActivity" >
<ListView
android:id="@+id/ListView1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</RelativeLayout>
2. person_item.xml 파일 작성
3. Person_Item.java 파일 생성
을 하고 나면 아래와 같이 파일이 만들어진다.
이 파일에 XML 데이터에서 나오는 uid, name, mobile 부분을 String 변수로 적어준다.
그리고 생성자를 추가한다.
package com.example.myxml;
public class Person_Item {
String uid;
String name;
String mobile;
public Person_Item() {
}
생성자를 추가한 후 화면에서 마우스 우클릭을 하고 아래 그림처럼 눌러주면 코드가 자동으로 추가된다.
여기까지 하면 Person_Item.java 파일 생성은 완료된 거다.
4. 퍼미션 설정
안드로이드가 어떤 컴포넌트를 시작하려면 먼저 애플리케이션 안에 그 컴포넌트가 존재하는지를 알아야 한다. 애플리케이션안의 모든 컴포넌트들은 AndroidManifest.xml 안에 선언되어야 한다.
AndroidManifest.xml 파일에 선언되지 않은 Activity, Service, Content Provider 는 안드로이드 시스템에서 전혀 알 수가 없다. 결과적으로 실행할 수가 없다.AndroidManifest.xml 파일에서 퍼머션 추가
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myxml"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="15"
android:targetSdkVersion="19" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
...
</manifest>
5. MainActivity.java 파일 코드 추가
XmlPullParser 는 문서를 순차적으로 읽으며 이벤트를 발생시킨다.
START_DOCUMENT 이벤트는 문서의 시작을
END_DOCUMENT 은 문서의 끝을
START_TAG는 태그의 시작을 (예 : <uid> )
END_TAG는 태그의 끝을 (예 : </uid> )
TEXT는 태그의 시작과 끝 사이에서 나타난다. (예 : <uid>여기서 TEXT 이벤트 발생</uid> )
서버, Local 둘다 있는 코드
package com.example.myxml;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.util.ArrayList;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class MainActivity extends Activity {
ListView listView;
// xml을 파싱하여 저장할 ArrayList를 선언한다.
ArrayList<Person> arrayList = new ArrayList<Person>();
GetData getdata = new GetData(); // url을 이용하여 데이터를 가져오는 클래스 선언
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView)findViewById(R.id.ListView1);
/*// Local xml 파일 읽어오기
ArrayList<Person> list = xmlParser();
String[] data = new String[list.size()];
for(int i=0;i < list.size();i++) {
data[i] = list.get(i).getUid()+ " : " + list.get(i).getName()+ " / " + list.get(i).getMobile();
}
// 리스트뷰에 붙일 어뎁터 클래스 선언
ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1, data);
*/
// 서버 접속
// GetData 클래스를 통하여 데이터를 읽어드리게 한후에 값을 가져옴
getdata.execute(null, null, null); // 이 메소드를 호출하면 doinBackground가 호출됨
String[] data;
while(true) {
try{
Thread.sleep(1000);
// 네트워크를 통하여 데이터를 모두 불러왔다면
if(getdata.flag == true) {
data = new String[arrayList.size()];
for(int i=0;i < arrayList.size();i++) {
data[i] = arrayList.get(i).getUid()+ " : " + arrayList.get(i).getName()+ " / " + arrayList.get(i).getMobile();
}
break;
}
} catch (Exception e) {
e.printStackTrace();
}
}
// 리스트뷰에 붙일 어뎁터 클래스 선언
ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, data);
listView.setAdapter(adapter);
}
public class GetData extends AsyncTask<Void, Void, Void> {
// 웹사이트에 접속할 주소
String uri = "http://www.abc.com/mobile/get_xml.php";
Boolean flag = null; // 데이터의 내용을 모두 읽어드렸는지에 대한 정보를 저장
@Override
protected Void doInBackground(Void... params) {
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser parser = factory.newPullParser();
// 서버에 있는 XML 데이터 읽어온다.
URL url = new URL(uri);
InputStream inputStream = url.openStream();
parser.setInput(inputStream, "utf-8"); // XmlPullParser에 XML 데이터와 인코딩 방식을 입력
int eventType = parser.getEventType();
Person person = null;
// 파싱한 xml 이 END_DOCUMENT(종료 태그)가 나올때 까지 반복한다.
while(eventType != XmlPullParser.END_DOCUMENT) {
switch(eventType) {
case XmlPullParser.START_TAG:
String startTag = parser.getName();
if(startTag.equals("items")) {
person = new Person();
} else if(startTag.equals("uid")){
person.setUid(parser.nextText());
} else if(startTag.equals("name")){
person.setName(parser.nextText());
} else if(startTag.equals("mobile")){
person.setMobile(parser.nextText());
}
break;
case XmlPullParser.END_TAG: // End 태그를 만나면
String endTag = parser.getName();
if(endTag.equals("items")) {
arrayList.add(person);
}
break;
}
eventType = parser.next(); // 다음 태그로 이동
}
flag = true; // 모든 xml문서를 읽어드렸다면
} catch(XmlPullParserException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
private ArrayList<Person> xmlParser() {
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser parser = factory.newPullParser();
// Local 에 있는 XML 데이터를 읽어온다.
parser = getResources().getXml(R.xml.mytest2);
int eventType = parser.getEventType();
Person person = null;
// 파싱한 xml 이 END_DOCUMENT(종료 태그)가 나올때 까지 반복한다.
while(eventType != XmlPullParser.END_DOCUMENT) {
switch(eventType) {
case XmlPullParser.START_TAG:
String startTag = parser.getName();
if(startTag.equals("items")) {
person = new Person();
} else if(startTag.equals("uid")){
person.setUid(parser.nextText());
} else if(startTag.equals("name")){
person.setName(parser.nextText());
} else if(startTag.equals("mobile")){
person.setMobile(parser.nextText());
}
break;
case XmlPullParser.END_TAG: // End 태그를 만나면
String endTag = parser.getName();
if(endTag.equals("items")) {
arrayList.add(person);
}
break;
}
eventType = parser.next(); // 다음 태그로 이동
}
} catch(XmlPullParserException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return arrayList;
}
}
서버파일 접속 코드만 별도 발췌
package com.example.myxml;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.util.ArrayList;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class MainActivity extends Activity {
ListView listView;
// xml을 파싱하여 저장할 ArrayList를 선언한다.
ArrayList<Person> arrayList = new ArrayList<Person>();
GetData getdata = new GetData(); // url을 이용하여 데이터를 가져오는 클래스 선언
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView)findViewById(R.id.ListView1);
// 서버 접속
// GetData 클래스를 통하여 데이터를 읽어드리게 한후에 값을 가져옴
getdata.execute(null, null, null); // 이 메소드를 호출하면 doinBackground가 호출됨
String[] data;
while(true) {
try{
Thread.sleep(1000);
// 네트워크를 통하여 데이터를 모두 불러왔다면
if(getdata.flag == true) {
data = new String[arrayList.size()];
for(int i=0;i < arrayList.size();i++) {
data[i] = arrayList.get(i).getUid()+ " : " + arrayList.get(i).getName()+ " / " + arrayList.get(i).getMobile();
}
break;
}
} catch (Exception e) {
e.printStackTrace();
}
}
// 리스트뷰에 붙일 어뎁터 클래스 선언
ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, data);
listView.setAdapter(adapter);
}
public class GetData extends AsyncTask<Void, Void, Void> {
// 웹사이트에 접속할 주소
String uri = "http://www.abc.com/mobile/get_xml.php";
Boolean flag = null; // 데이터의 내용을 모두 읽어드렸는지에 대한 정보를 저장
@Override
protected Void doInBackground(Void... params) {
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser parser = factory.newPullParser();
// 서버에 있는 XML 데이터 읽어온다.
URL url = new URL(uri);
InputStream inputStream = url.openStream();
parser.setInput(inputStream, "utf-8"); // XmlPullParser에 XML 데이터와 인코딩 방식을 입력
int eventType = parser.getEventType();
Person person = null;
// 파싱한 xml 이 END_DOCUMENT(종료 태그)가 나올때 까지 반복한다.
while(eventType != XmlPullParser.END_DOCUMENT) {
switch(eventType) {
case XmlPullParser.START_TAG:
String startTag = parser.getName();
if(startTag.equals("items")) {
person = new Person();
} else if(startTag.equals("uid")){
person.setUid(parser.nextText());
} else if(startTag.equals("name")){
person.setName(parser.nextText());
} else if(startTag.equals("mobile")){
person.setMobile(parser.nextText());
}
break;
case XmlPullParser.END_TAG: // End 태그를 만나면
String endTag = parser.getName();
if(endTag.equals("items")) {
arrayList.add(person);
}
break;
}
eventType = parser.next(); // 다음 태그로 이동
}
flag = true; // 모든 xml문서를 읽어드렸다면
} catch(XmlPullParserException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
}
Local 파일 접속 코드만 별도 발췌
package com.example.myxml;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.util.ArrayList;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class MainActivity extends Activity {
ListView listView;
// xml을 파싱하여 저장할 ArrayList를 선언한다.
ArrayList<Person> arrayList = new ArrayList<Person>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView)findViewById(R.id.ListView1);
// Local xml 파일 읽어오기
ArrayList<Person> list = xmlParser();
String[] data = new String[list.size()];
for(int i=0;i < list.size();i++) {
data[i] = list.get(i).getUid()+ " : " + list.get(i).getName()+ " / " + list.get(i).getMobile();
}
// ArrayAdapter에 ArrayList를 넣어서 ListView에 등록한다.
ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1, data);
listView.setAdapter(adapter);
}
private ArrayList<Person> xmlParser() {
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser parser = factory.newPullParser();
// Local 에 있는 XML 데이터를 읽어온다.
parser = getResources().getXml(R.xml.mytest2);
//parser.setInput(new InputStreamReader(is, "utf-8"));
int eventType = parser.getEventType();
Person person = null;
// 파싱한 xml 이 END_DOCUMENT(종료 태그)가 나올때 까지 반복한다.
while(eventType != XmlPullParser.END_DOCUMENT) {
switch(eventType) {
case XmlPullParser.START_TAG:
String startTag = parser.getName();
if(startTag.equals("items")) {
person = new Person();
} else if(startTag.equals("uid")){
person.setUid(parser.nextText());
} else if(startTag.equals("name")){
person.setName(parser.nextText());
} else if(startTag.equals("mobile")){
person.setMobile(parser.nextText());
}
break;
case XmlPullParser.END_TAG: // End 태그를 만나면
String endTag = parser.getName();
if(endTag.equals("items")) {
arrayList.add(person);
}
break;
}
eventType = parser.next(); // 다음 태그로 이동
}
} catch(XmlPullParserException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return arrayList;
}
}
ListView 모양을 처리하는 부분을 아직 제대로 이해하지 못해서 이 부분은 나중에 알게되면 추가 정리를 할 생각이다.
일단은 PHP 를 통해서 MySQL 데이터를 XML 형태로 안드로이드 단말에서 볼 수 있다는 것 자체에 의미를 두련다.
'안드로이드 > Android Data 통신' 카테고리의 다른 글
안드로이드 PHP 연동(자동로그인, 등록단말 검사, 네트워크 상태 검사) (4) | 2016.06.27 |
---|---|
안드로이드와 PHP 로그인 연동처리 (자동로그인, 네트워크 상태 체크 포함) (4) | 2016.06.25 |
안드로이드 AsyncTask (0) | 2016.06.21 |
[Eclipse]안드로이드 MySQL DB 연동 (안드로이드 앱 Part : ListView) - JSON 방식 (0) | 2016.06.08 |
안드로이드 MySQL DB 연동 (PHP Web Part) (0) | 2016.06.08 |
Link2Me