Архив рубрики ‘Android’

Разработка под Android

Posted: Май 9, 2011 in Android

Разработаем приложение, которое будет показывать последние 50 землетрясений.

Информацию будет брать с RSS http://www.emsc-csem.org/service/rss/rss.php?typ=emsc.
Android-приложению нужен доступ в интернет. Для этого добавим в файл AndroidManifest.xml строку

<uses-permission android:name="android.permission.INTERNET"/>

Разметка будет просейшей: баллы и место происшествия будут отражаться в ListView

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >

<TextView android:id="@+id/titleText"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
/>
    
<ListView android:id="@+id/earthquakeList"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content">
</ListView>    

</LinearLayout>

Создадим MainActivity и добавим в него метод

private void ShowEarthquakes() {
	pd = ProgressDialog.show(MainActivity.this, 
							 "Working...", 
							 "request to server", 
							 true, 
							 false);
	
	new ParseFeed().execute(rss_url);
}

ParseFeed унаследуем от AsyncTask

 private class ParseFeed extends AsyncTask<String, Void, List<String>> {
	        
	protected List<String> doInBackground(String... arg) {
	 
		List<String> output = new ArrayList<String>();
		try
		{
			HtmlHelper hh = new HtmlHelper(new URL(arg[0]));
			List<String> titles = hh.getItemsTitles();
			
			for (Iterator<String> iterator = titles.iterator(); iterator.hasNext();)
			{
				output.add(iterator.next());
			}
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		return output;
	}

	protected void onPostExecute(List<String> output) {
		
		pd.dismiss();
		
		ListView listview = (ListView) findViewById(R.id.earthquakeList);
		
		listview.setAdapter(
				new ArrayAdapter<String>(MainActivity.this,
										 android.R.layout.simple_list_item_1, 
										 output));
	}
}

Для преобразования XML в валидный HTML воспользуемся библиотечкой HtmlCleaner. Зная структуры RSS можем написать вот такой класс для выделения нужного элемента

public class HtmlHelper {
	
    private TagNode rootNode;

    public HtmlHelper(URL htmlPage) throws IOException
    {
        HtmlCleaner cleaner = new HtmlCleaner();
        
        //creates valid html from xml
        rootNode = cleaner.clean(htmlPage);
    }
    
    List<String> getItemsTitles(){
    	
    	 List<String> linkList = new ArrayList<String>();

         TagNode linkElements[] = rootNode.getElementsByName("item", true);
         
         for (int i = 0; linkElements != null && i < linkElements.length; i++)
         {
        	 TagNode curTagNode = linkElements[i]; 
        	 
        	 ContentNode curContNode = (ContentNode)curTagNode.getChildren().get(0);
        	 
          	 linkList.add(curContNode.getContent().toString());
         }

         return linkList;
    }
}

Полный исходный код доступен по ссылке https://atdushi.files.wordpress.com/2011/05/csem-zip.doc. Только необходимо изменить расширение на zip.

Реклама