[Tip]Android에서의 RSS Reader 구현 개발 팁 / 모바일 웹

첨부파일 :



2009/03/24 21:30

 http://blog.naver.com/kippee/130044828392

네이버 블로그(RSS 2.0)를 가져올 수 있는 간단한 RSS Reader를 안드로이드 에서 구현하였다.

실제 사용하기 보단 (구글폰도 없지만) Study 개념으로 작성한 것이기 때문에

네이버 블로그만 가져올 수 있고 (물론, java 소스를 고치면 다른 것도 가능하다)

링크되어 있는 이미지 처리도 안된다

 

여기에는 몇가지 기술을 적용하였는데

  • 입력창에서 Blog ID를 입력하면 List를 볼수 있는 화면 (특정 Activity 호출)으로 전환
  • 간단한 팝업창
  • 블로그들을 Fetch하는데 지루하지 않도록 Progress Dialog를 보여주는 방법
  • ListView에서 클릭하면 별도의 Dialog Box가 보여주는 방법
  • 특정 부분을 클릭하면 안드로이드  제공 블라우저을 호출하는 것

호출한 XML문서를 Parsing 하는 방법 등이다.

 

1. 입력창에서 Blog ID를 입력하면 List를 볼수 있는 화면 (특정 Activity 호출)으로 전환

위의 그림처럼 확인 버튼을 누르면 다른 화면으로 전환하게 되는 데 버튼에 리슨너를 등록하고

   //* 확인 버튼에 리슨너 등록

  mbtStartGetRSS.setOnClickListener(mGoListner);

리슨너를 아래와 같이 Define 해주면 된다

여기서 Intent를 생성하고 실행된 Activity Class와 함께 보내줄 데이타를 지정해준다.

 

 private DialogInterface.OnClickListener mGoOKListener = new DialogInterface.OnClickListener()
 {     

  public void onClick(DialogInterface dialog, int which) {
   String mBlogId;
   

   mBlogId = metBlogId.getText().toString();
   // TODO Auto-generated method stub
   // getRSSItem();
   Intent mI = new Intent();
   mI.setClass(RSSMain.this,BlogList.class);
   mI.putExtra("Blogger",metBlogId.getText().toString());
   startActivity(mI);
   finish();
  }

  
 };

2. 간단한 팝업창

일반적으로 팝업창은 Alertailog의 Builder Class를 이용하여 할 수도 있지만

Toast를 이용하여 간단하게 작성할 수도 있다.

  private OnClickListener mGoListner = new OnClickListener()
 {      

  @Override
  public void onClick(View arg0) {
   // TODO Auto-generated method stub
   if (metBlogId.getText().toString().length() == 0){ 
    Toast.makeText(RSSMain.this,"BlogID를 입력하세요",Toast.LENGTH_SHORT )
    .show();
   }
   else
    showDialog(POPUP_DIALOG);
  }  
 };

 

3. 블로그들을 Fetch하는데 지루하지 않도록 Progress Dialog를 보여주는 방법

이 부분을 구현하는 데 가장 많이 시간이 소요 되었다.

착안점은 먼저 Progress Bar를 먼저 보여 주고 BackGroud로 Blog를 Fetch 해야 되는 데

이부분은 별도의 thread로 처리해야 된다.

일단 Progress Bar를 표시하는 방법은


onCreateDialog 에 다른 Dialog와 함께 Progress Dialog를 정의한다.

  protected Dialog onCreateDialog(int id) {
  // TODO Auto-generated method stub
  switch (id) {
  case ITEM_DIALOG:
   LayoutInflater li = LayoutInflater.from(this);
   View ItemDetailsView = li.inflate(R.layout.item_details, null);

   AlertDialog.Builder mItemDialog = new AlertDialog.Builder(this);
   mItemDialog.setTitle("블로그 정보");
   mItemDialog.setPositiveButton("확인", null);
   mItemDialog.setNegativeButton("취소", null);
   mItemDialog.setView(ItemDetailsView);
   return mItemDialog.create();
  case PROGRESS_DIALOG:
   mProgressDialog = new ProgressDialog(this);
   mProgressDialog.setMessage("Fetching Blogs ....");
   mProgressDialog.setIndeterminate(true);
   mProgressDialog.setCancelable(true);
   mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
   return mProgressDialog;


  }
  return null;
 }

보여주는 시점에서 ShowDialog(PROGRESS_DIALOG) 를 호출하면 된다.

 

위에서 언급한 것 처럼 실제로 Progress Dialog가 보여주는 동안에 별도의 Thread를 생성하여 Blog를 가져와야 되는 데 코드는 아래와 같다

 new Thread() {
   public void run() {
    try{
     // Do some Fake-Work
     if ((mDoc = readFeeder(mFeeder)) != null)
      parseBlog(mDoc);
     mProgressDialog.dismiss();
     mProgressHandler.post(mUpdateResults);


    } catch (Exception e) { 
     Log.e("RSS", "Exception : Unknown Exception ");
    }
    // Dismiss the Dialog
    //mProgressDialog.dismiss();
   }
  }.start();

여기서 중요한 것은 Backgroud로 실행된 결과는 결코 화면으로 표시되는 것이 아니라 (화면에 표시하면 에러가 발생한다) 별도의 메소드로 처리해야 되는 데 일단 핸들러로 Message Queue에 Runnable을 post 해야 한다.  mProgressHandler.post(mUpdateResults);   

그리고 실제 Runnable에서 다시 표시할 수 있는 코드을 작성해야 된다.

  private void updateResultsInUi()
 {
  mtvBlogTitle.setText(mBlogURL);
  mtvBlogLink.setText(" http://www.naver.com");
  mtvBlogDesc.setText(mBlog.getMDesc());
  mtvBlogGenerator.setText(mBlog.getMGenerator());
  SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
  mtvBlogPubdate.setText(sdf.format(mBlog.getMPubdate()));
  
  aaI.notifyDataSetChanged();
  Toast.makeText(getApplicationContext(),mBlogs+
    "개의 Blog들이 있습니다.",
    Toast.LENGTH_LONG).show();
  Log.e("RSS", "updateResultsInUi Started ");  
 } 
여기서 notifyDataSetChanged는 ListView add 된 내용을 다시 보여주는 method 이다

+ Recent posts