Страница 1 из 1

Загрузка XML с сервера, разбор и вставка в TextView

Добавлено: 12 июл 2013, 11:39
sanu0074
Приложение выполняется без ошибок, но результат не вставляется в TextView

Вызов XML-загрузчика:

Код: Выделить всё

        AsyncDownloader downloader = new AsyncDownloader();
        downloader.execute(); 
Функция которая записывает результат, находится в классе Main:

Код: Выделить всё

    public void rec(String data)
    {
    	 TextView tv = (TextView) findViewById(R.id.textView1);
    	 tv.setText(data);
    }
Парсер XML:

Код: Выделить всё

class AsyncDownloader extends AsyncTask<Object, String, Integer>{

	@Override
	protected Integer doInBackground(Object... params) {
		
		XmlPullParser recivedData = null;
		try {
			recivedData = tryDownloadingXmlData();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		int recordsFound = 0;
		try {
			recordsFound = tryParsingXmlData(recivedData);
		} catch (XmlPullParserException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			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 lnk="";
		String data="";
		
		
		while(eventType!=XmlResourceParser.END_DOCUMENT)
		{
			String tagName=xmlData.getName();
			switch(eventType)
			{
			case XmlResourceParser.START_TAG:
				if(tagName.equals("lnk"))
				{
					data+=xmlData.getText();
				}
			break;
			
			case XmlResourceParser.TEXT:
				data+=xmlData.getText();
			break;
			
			
			case XmlResourceParser.END_TAG:
				if(tagName.equals("lnk"))
				{
					recordsFound++;
					publishProgress(lnk,data);
				}
			break;
			}
			eventType=xmlData.next();
			
			if(recordsFound==0){
				publishProgress();
			}
		}
		
		
		
	}

	protected void onProgessUpdate(String... values){
		
		if(values.length==2)
		{
			String data = values[0];
			String lnk = values[1];
			Main main = new Main();
			main.rec(data+lnk);
		}
		
		super.onProgressUpdate(values);
	}
	
	
}

Re: Загрузка XML с сервера, разбор и вставка в TextView

Добавлено: 12 июл 2013, 11:49
anber
А почему в названии метода onProgressUpdate пропущена буква r ?

PS. Если это решит проблему тогда поговорим подробнее про аннотацию @Override

Re: Загрузка XML с сервера, разбор и вставка в TextView

Добавлено: 12 июл 2013, 11:58
sanu0074
anber писал(а): Если это решит проблему тогда поговорим подробнее про аннотацию @Override
проблеме не решилась..

Re: Загрузка XML с сервера, разбор и вставка в TextView

Добавлено: 12 июл 2013, 12:06
anber
sanu0074 писал(а):проблеме не решилась..
ок...
Попробуй добавить метод onPostExecute и вывести в TextView то значение которое в него прийдет.
И да, отладчиком пользоваться умеешь?

Re: Загрузка XML с сервера, разбор и вставка в TextView

Добавлено: 12 июл 2013, 12:43
sanu0074
anber писал(а):
sanu0074 писал(а):проблеме не решилась..
ок...
Попробуй добавить метод onPostExecute и вывести в TextView
результат тоже...(( ничего не выводит!

могу скинуть полностью проект, потестиш?

Re: Загрузка XML с сервера, разбор и вставка в TextView

Добавлено: 12 июл 2013, 12:51
anber
sanu0074 писал(а):
anber писал(а):
sanu0074 писал(а):проблеме не решилась..
ок...
Попробуй добавить метод onPostExecute и вывести в TextView
результат тоже...(( ничего не выводит!

могу скинуть полностью проект, потестиш?
кидай, я сегодня добрый...

Re: Загрузка XML с сервера, разбор и вставка в TextView

Добавлено: 12 июл 2013, 12:53
sanu0074
anber писал(а): кидай, я сегодня добрый...
:D спасибо)))

Re: Загрузка XML с сервера, разбор и вставка в TextView

Добавлено: 12 июл 2013, 13:14
anber
sanu0074 писал(а):
anber писал(а): кидай, я сегодня добрый...
:D спасибо)))
Есть ммм...несколько вопросов к твоему коду:

1) ТЫ ЧИТАЛ МОЕ ПЕРВОЕ СООБЩЕНИЕ В ЭТОЙ ТЕМЕ, А ИМЕННО:
А почему в названии метода onProgressUpdate пропущена буква r ?
2) В методе onProgressUpdate что это?

Код: Выделить всё

			Main main = new Main();
			main.rec(data+lnk);

Re: Загрузка XML с сервера, разбор и вставка в TextView

Добавлено: 12 июл 2013, 13:20
sanu0074
anber писал(а): А почему в названии метода onProgressUpdate пропущена буква r?
Где пропущена? вроде ж без ошибок....

Код: Выделить всё

2) В методе [b]onProgressUpdate[/b] что это?
			Main main = new Main();
			main.rec(data+lnk);
Здесь создается объект класса Main и через него вызывается функция записи ответа от сервера в TextView

Re: Загрузка XML с сервера, разбор и вставка в TextView

Добавлено: 12 июл 2013, 13:28
anber
1) я хочу сыграть с тобой в одну игру...называется найди одно отличие:
onProgessUpdate
onProgressUpdate
2) проблема в том что объект класса Main уже существует - его создала система, и в нем есть TextView. В том объекте класса Main который ты создаешь нет никакого TextView и при выполнении этого кода приложение упадет с ошибкой. Короче говоря нужно использовать уже существующий обьект Main

Re: Загрузка XML с сервера, разбор и вставка в TextView

Добавлено: 12 июл 2013, 13:39
anber
Как решить эту проблему?
Смотри - я немного подправил твой файл:

Код: Выделить всё

package com.t.test;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;

import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.content.res.XmlResourceParser;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;
import android.widget.ImageView;
import android.widget.TextView;

public class Main extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        ImageView iv = (ImageView) findViewById(R.id.imageView1);
        new DownloadImageTask(iv).execute("http://home-android.ru/content/games/1090/1372176761712958M.png");
        
       

        AsyncDownloader downloader = new AsyncDownloader();
        downloader.execute(); 
    } 
    
    public void rec(String data)
    {
    	 TextView tv = (TextView) findViewById(R.id.textView1);
    	 tv.setText(data);
    }
    
    
    class AsyncDownloader extends AsyncTask<Object, String, Integer>{

    	@Override
    	protected Integer doInBackground(Object... params) {
    		
    		XmlPullParser recivedData = null;
    		try {
    			recivedData = tryDownloadingXmlData();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		int recordsFound = 0;
    		try {
    			recordsFound = tryParsingXmlData(recivedData);
    		} catch (XmlPullParserException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			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 lnk="";
    		String data="";
    		
    		
    		while(eventType!=XmlResourceParser.END_DOCUMENT)
    		{
    			String tagName=xmlData.getName();
    			switch(eventType)
    			{
    			case XmlResourceParser.START_TAG:
    				if(tagName.equals("lnk"))
    				{
    					data+=xmlData.getText();
    				}
    			break;
    			
    			case XmlResourceParser.TEXT:
    				data+=xmlData.getText();
    			break;
    			
    			
    			case XmlResourceParser.END_TAG:
    				if(tagName.equals("lnk"))
    				{
    					recordsFound++;
    					publishProgress(lnk,data);
    				}
    			break;
    			}
    			eventType=xmlData.next();
    			
    			if(recordsFound==0){
    				publishProgress();
    			}
    		}
    		
    		
    		
    	}

    	/*
    	@Override
    	public void onPostExecute(String... values)
    	{
    		
    		String data = values[0];
    		String lnk = values[1];
    		Main main = new Main();
    		main.rec(data+lnk);
    	}
    	*/
    	
    	@Override
    	protected void onPostExecute(Integer result) {
    		super.onPostExecute(result);
    		// твой код
    	}
    	


    	@Override
    	protected void onProgressUpdate(String... values){
    		
    		if(values.length==2)
    		{
    			String data = values[0];
    			String lnk = values[1];
    			// Main main = new Main();
    			Main.this.rec(data+lnk);
    		}
    		
    		super.onProgressUpdate(values);
    	}
    	
    	
    }    
    
    class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
        ImageView bmImage;

        DownloadImageTask(ImageView bmImage) {
            this.bmImage = bmImage;
        }

        protected Bitmap doInBackground(String... urls) {
            String urldisplay = urls[0];
            Bitmap mIcon11 = null;
            try {
                InputStream in = new java.net.URL(urldisplay).openStream();
                mIcon11 = BitmapFactory.decodeStream(in);
            } catch (Exception e) {
                Log.e("Error", e.getMessage());
                e.printStackTrace();
            }
            return mIcon11;
        }

        protected void onPostExecute(Bitmap result) {
            bmImage.setImageBitmap(result);
        }
    }
    
        
}









Что я изменил?
1) Написал методы onPostExecute и onProgressUpdate без грамматических ошибок, и так чтобы параметры которые в них приходят соответствовали тем которые ты указал при создании AsyncTask<Object, String, Integer> - последнее значение Integer должно соответствовать значению которое возвращает doInBackground и приходит в onPostExecute
2) внес классы AsyncDownloader и DownloadImageTask внутрь класса Main. Теперь они могут получить доступ public к методам существующего объекта класса Main, например:
Main.this.rec(data+lnk);

Re: Загрузка XML с сервера, разбор и вставка в TextView

Добавлено: 12 июл 2013, 13:44
sanu0074
anber писал(а):1) я хочу сыграть с тобой в одну игру...
Работает, спасибо большое)))

Re: Загрузка XML с сервера, разбор и вставка в TextView

Добавлено: 12 июл 2013, 13:48
anber
посмотри, я там еще выложил пример кода

Re: Загрузка XML с сервера, разбор и вставка в TextView

Добавлено: 12 июл 2013, 13:53
sanu0074
anber писал(а):посмотри, я там еще выложил пример кода
уже юзаю, спасибо)