Например есть класс который получает XML с сервера, как его разбить на части которые изменяются и которые нет. Нужно отделить загрузку xml из указанного адреса, и часть которая занимается разбором сообщения:
Код: Выделить всё
class AsyncDownloader extends AsyncTask<Object, String, Integer>{
public String TAG="MyLog";
@Override
protected Integer doInBackground(Object... params) {
XmlPullParser recivedData = null;
try {
recivedData = tryDownloadingXmlData();
} catch (IOException e) { e.printStackTrace(); }
int recordsFound = 0;
try {
recordsFound = tryParsingXmlData(recivedData);
} catch (XmlPullParserException e) { e.printStackTrace(); }
catch (IOException e) { e.printStackTrace(); }
return recordsFound;
}
private XmlPullParser tryDownloadingXmlData() throws IOException {
try{
URL xmlUrl = new URL("http://home-android.ru/android/main");
XmlPullParser recivedData = XmlPullParserFactory.newInstance().newPullParser();
recivedData.setInput(xmlUrl.openStream(),null);
return recivedData;
}
catch(XmlPullParserException e){ }
catch(IOException e) { }
return null;
}
private int tryParsingXmlData(XmlPullParser recivedData) throws XmlPullParserException, IOException {
if(recivedData != null)
{
processRecivedData(recivedData);
}
return 0;
}
private void processRecivedData(XmlPullParser xmlData) throws XmlPullParserException, IOException {
int eventType = -1;
int recordsFound = 0;
String tagName="";
String imageLnk="";
String name="";
String id = "";
String type = "";
String des="";
String cat="";
String cd="";
Log.d(TAG, "Старт парсинга XML");
while(eventType!=XmlResourceParser.END_DOCUMENT)
{
switch(eventType)
{
case XmlResourceParser.START_TAG:
tagName=xmlData.getName();
Log.d(TAG, "START_TAG: name = " + xmlData.getName());
break;
case XmlResourceParser.TEXT:
Log.d(TAG, "Text_TAGNAME: <"+tagName+">"+xmlData.getText()+"</"+tagName+">");
if(TextUtils.equals(tagName,"name")) {
name = xmlData.getText();
}
if(TextUtils.equals(tagName,"imageLnk")) {
imageLnk = xmlData.getText();
}
if(TextUtils.equals(tagName,"id")) {
id = xmlData.getText();
}
if(TextUtils.equals(tagName,"type")) {
type = xmlData.getText();
}
if(TextUtils.equals(tagName,"des")) {
des = xmlData.getText();
}
if(TextUtils.equals(tagName,"cat")) {
cat = xmlData.getText();
}
if(TextUtils.equals(tagName,"cd")) {
cd = xmlData.getText();
}
break;
case XmlResourceParser.END_TAG:
Log.d(TAG, "END_TAG: name = " + xmlData.getName());
recordsFound++;
tagName = "";
if ("item".equals(xmlData.getName())) {
publishProgress(imageLnk, name, id, type,des,cat,cd);
}
break;
default: break;
}
eventType=xmlData.next();
if(recordsFound==0){
publishProgress();
}
}
}
@Override
protected void onPostExecute(Integer result) {
TextView w = (TextView) findViewById(R.id.wait);
w.setText(null);
}
@Override
protected void onProgressUpdate(String... values){
if(values.length>1)
{
String imageLnk = values[0];
String name = values[1];
String id = values[2];
String type = values[3];
String des = values[4];
String cat = values[5];
String cd = values[6];
Main.this.rec(imageLnk,name,id,type,des,cat,cd);
}
super.onProgressUpdate(values);
}
} tryDownloadingXmlData() должна уметь принимать адрес к скрипту
onProgressUpdate() - мы можем в основном классе изменять полностью, и processRecivedData() тоже может быть везде разная...
Т.е. я хочу максимально сократить в коде процесс парсинга XML, так как есть несколько разных активити которые будут подгружать XML с разных адресов и сообщения будут разные по структуре....
в итоге, в tryDownloadingXmlData() передаем адрес к XML, onProgressUpdate() и processRecivedData() строим в кадом активити индивидуальное, а остальное - остается общее для всех.....
Как это реализовать?