안드로이드 스레드 XML 뷰 와 웹 이미지 뷰 (2) : Android XML Http AsyncTask ImageView Intent
"안드로이드 스레드 XML 뷰와 웹 이미지 뷰"
> 이전 글 참조
* 개발환경
- 안드로이드 버전
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 클래스도 생략합니다. 이전 포스팅 참조하세요)
메인 액티비티 클래스
이전 포스팅에서 추가된 부분은 리스트 뷰에 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 형식일 경우 포맷에 맞게 출력합니다. } } }