> Hello World !!!

     

@syaku

안드로이드 스레드 XML 뷰 와 웹 이미지 뷰 (2) : Android XML Http AsyncTask ImageView Intent


written by Seok Kyun. Choi. 최석균

"안드로이드 스레드 XML 뷰와 웹 이미지 뷰"

> 이전 글 참조

2013/10/24 - [개발노트/안드로이드 SDK] - 안드로이드 스레드 XML 리스트 뷰 (1) : Android XML ListView Adapter Http AsyncTask



* 개발환경


- 안드로이드 버전

minSdkVersion : 16 (Android 4.1.2)

targetSdkVersion 18 (Android 4.3)


- 개발 플렛폼 Mac OS X 10.8.5 ADT (Android Developer Tools Build: v22.2.1-833290)



이전 포스팅과 이어지는 글입니다. 필히 이전 글을 참조하시기 바랍니다. 

이번 포스팅은 리스트 뷰에서 출력된 목록을 클릭했을 때 상세페이지로 이동하는 과정과 출력되는 부분을 포스팅합니다.

추가로 웹 이미지 파일을 출력하는 방법도 포함하였습니다.


- resource 는 첨부파일을 참조하고 자바 소스만 포스팅하겠습니다. 

  (HttpConnection 클래스와 Xml2Object 클래스도 생략합니다. 이전 포스팅 참조하세요)



SyakuXmlApp.zip






메인 액티비티 클래스


이전 포스팅에서 추가된 부분은 리스트 뷰에 OnClick 이벤트와 이동될때 전송되어야 할 자료를 보내주는 작업입니다.

리스트뷰에 사용하는 onClick 이벤트는 OnItemClickListener 입니다.

아래 소스에서 추가된 주석을 참고하세요.



package com.syaku;

import java.io.InputStream;
import java.util.ArrayList;

import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.util.SparseArray;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.TextView;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;

public class SyakuMain extends Activity {
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.syaku_main);
		
		// XML 데이터 호출
		XmlAsyncTask xml = new XmlAsyncTask(this);
		String url = "http xml url";
		xml.execute(url);
	}
	
	// AsyncTask 스레드 OnItemClickListener 상속 받아야 합니다.
	class XmlAsyncTask extends AsyncTask< String, Void , ArrayList<SparseArray<String>> > implements OnItemClickListener{
		Context context;
		ArrayList<XmlBean> list_item;
		
		public XmlAsyncTask(Context context) {
			this.context = context;
		}
		
		@Override
		protected ArrayList<SparseArray<String>> doInBackground(String... params) {
			ArrayList<SparseArray<String>> list = new ArrayList<SparseArray<String>>();
			
			try {
				
				String url = params[0];
				HttpConnection http = new HttpConnection(url);
				InputStream input_stream = http.getInputStream();
				
				Xml2Object xml = new Xml2Object(input_stream);
				list = xml.list("item");
			} catch (Exception e) {
				Log.e("GET ERROR",e.toString());
			}
			
			return list;
		}
		
		@Override
		protected void onPostExecute(ArrayList<SparseArray<String>> result) {
			super.onPostExecute(result);
			
			int count = result.size();
			Log.d("ArrayList count",""+count);
			
			TextView tv = (TextView) findViewById(R.id.list_count);
			tv.setText(""+count);
			
			list_item = new ArrayList<XmlBean>();

			for (int i = 0; i < count; i++) {
				SparseArray<String> data = result.get(i);
				
				XmlBean bean = new XmlBean();
				
				String bunmyo_orl = data.get(bean.BUNMYO_ORL);
				String subject = data.get(bean.SUBJECT);
				String rdate = data.get(bean.RDATE);
				
				bean.setBunmyo_orl(bunmyo_orl);
				bean.setSubject(subject);
				bean.setRdate(rdate);
				
				list_item.add(bean);
			}
			
			XmlListAdapter adapter = new XmlListAdapter(context, R.layout.list, list_item);
			ListView listView = (ListView) findViewById(R.id.list_view);
			listView.setOnItemClickListener(this); // OnClick 이벤트 활성화
			listView.setAdapter(adapter);
		}
		
		@Override
		public void onItemClick(AdapterView<?> partent, View view, int position, long id) { // OnClick 이벤트 프로그램
			String bunmyo_orl = list_item.get(position).bunmyo_orl;
			
			Intent intent = new Intent(SyakuMain.this,SyakuView.class); // 이벤트가 일어났을 때 이동할 액티비티 클래스
			intent.putExtra("bunmyo_orl", bunmyo_orl); // 전송될 자료 담기
			startActivity(intent);
			finish();
		}
	}
	
}



상세보기 액티비티 클래스


메인 액티비티에서 전송된 자료를 이용해 해당 목록을 조회하여 출력합니다.

추가로 특정 웹 이미지도 함께 출력되게 작업했습니다.

[추가] 이미지와 xml 데이터를 서로 다른 스레드에서 작업하였지만, 한개 스레드 메서드에서도 가능합니다.


AndroidManifest.xml 에 액티비티를 추가하세요.

<activity android:name="com.syaku.SyakuView" />


아래 소스에서 추가된 주석을 참고하세요.


package com.syaku;

import java.io.BufferedInputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;

import android.os.AsyncTask;
import android.os.Bundle;
import android.text.Html;
import android.util.Log;
import android.util.SparseArray;
import android.widget.ImageView;
import android.widget.TextView;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;

public class SyakuView extends Activity {
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.view);
		
		Intent intent = getIntent();
		String bunmyo_orl = intent.getStringExtra("bunmyo_orl");
		
		// XML 데이터 호출
		XmlAsyncTask xml = new XmlAsyncTask();
		String url = "http://syaku.tistory.com/rss?no=" + bunmyo_orl; // 올바르지 않은 url 입니다. 사용하지 마세요~ ^_~
		xml.execute(url);
		
		// 이미지 호출
		String target_url = "http://sstatic.naver.net/search/img3/h1_naver2.png";
		ImageAsyncTask image = new ImageAsyncTask();
		image.execute(target_url);
		
	}
	

	// 이미지 스레드 
	class ImageAsyncTask extends AsyncTask<String, Void, Bitmap> {
		
		@Override
		protected Bitmap doInBackground(String... params) {
			Bitmap bitmap = null;
			
			try {
				String target_url = params[0];
				URL url = new URL(target_url);
				
			    URLConnection conn = url.openConnection();
			    conn.connect();
			    
			    BufferedInputStream bis = new BufferedInputStream(conn.getInputStream());
			    bitmap = BitmapFactory.decodeStream(bis);
			    bis.close();
			} catch (Exception e) {
			}
			
			return bitmap;
		}
		
		@Override
		protected void onPostExecute(Bitmap result) {
			super.onPostExecute(result);
			
			ImageView image = (ImageView) findViewById(R.id.image);
			image.setImageBitmap(result);
		}
		
	}
	
	// AsyncTask 스레드
	class XmlAsyncTask extends AsyncTask< String, Void , SparseArray<String> > {
		
		@Override
		protected SparseArray<String> doInBackground(String... params) {
			SparseArray<String> item = new SparseArray<String>();
			
			try {
				
				String url = params[0];
				HttpConnection http = new HttpConnection(url);
				InputStream input_stream = http.getInputStream();
				
				Xml2Object xml = new Xml2Object(input_stream);
				item = xml.object("item");
			} catch (Exception e) {
				Log.e("GET ERROR",e.toString());
			}
			
			return item;
		}
		
		@Override
		protected void onPostExecute(SparseArray<String> result) {
			super.onPostExecute(result);
			
			XmlBean bean = new XmlBean();
			
			String subject = result.get(bean.SUBJECT);
			String content = result.get(bean.CONTENT);
			String user_name = result.get(bean.USER_NAME);
			String rdate = result.get(bean.RDATE);
			
			TextView tv;
			
			tv = (TextView) findViewById(R.id.subject);
			tv.setText(subject);
			
			//tv = (TextView) findViewById(R.id.user_name);
			//tv.setText(user_name);
			
			//tv = (TextView) findViewById(R.id.rdate);
			//tv.setText(rdate);
			
			tv = (TextView) findViewById(R.id.content);
			tv.setText(Html.fromHtml(content)); // 데이터가 html 형식일 경우 포맷에 맞게 출력합니다.
		}
		
	}
}










posted syaku blog

Syaku Blog by Seok Kyun. Choi. 최석균.

http://syaku.tistory.com