Android: Реализация паузы, пока RSS-канал не будет извлечен с сайта - PullRequest
0 голосов
/ 17 июня 2011

Итак, я построил Ok RSS-ридер для нового спортивного приложения, которое скоро выйдет. Он будет читать каналы с различных спортивных сайтов и отображать их. У меня проблема в том, что каналы загружаются сразу при запуске действия, которое требует подключения к Интернету.

Если интернет-соединение прерывается или имеет место задержка, приложение иногда зависает и / или заставляет меня закрыться. Мне нужно что-то приостановить экран, пока содержимое канала не было извлечено из различных каналов XML.

Многие новостные приложения и другие программы чтения RSS делают это, когда вы нажимаете на новую категорию новостей. Вы получите анимированный диалог «обновление» или «загрузка». Вот мой текущий код.

public class MyActivity extends ListActivity implements OnClickListener {

    Button btn1;
    Button btn2;
    Button btn3;
    Button btn4;

    WebView webview;

    TextView feedTitle;
    TextView feedDescribtion;
    TextView feedPubdate;
    TextView feedLink;

private RSSFeed myRssFeed = null;

public class MyCustomAdapter extends ArrayAdapter<RSSItem> {

 public MyCustomAdapter(Context context, int textViewResourceId,
   List<RSSItem> list) {
  super(context, textViewResourceId, list);
 }

 @Override
 public View getView(int position, View convertView, ViewGroup parent) {
  // TODO Auto-generated method stub
  //return super.getView(position, convertView, parent);

  View row = convertView;

  if(row==null){
   LayoutInflater inflater=getLayoutInflater();
   row=inflater.inflate(R.layout.row, parent, false);
  }

  TextView listTitle=(TextView)row.findViewById(R.id.listtitle);
  listTitle.setText(myRssFeed.getList().get(position).getTitle());
  TextView listTitle2=(TextView)row.findViewById(R.id.listtitle2);
  listTitle2.setText(myRssFeed.getTitle());
  TextView listPubdate=(TextView)row.findViewById(R.id.listpubdate);
  String str = (myRssFeed.getList().get(position).getPubdate());


  SimpleDateFormat inputFormatter = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z"); //please notice the    capital M
  SimpleDateFormat outputFormatter = new SimpleDateFormat("MM/dd/yyyy");

  try {
      Date date = inputFormatter.parse(str);
      String text = outputFormatter.format(date);
      listPubdate.setText(text);
  } catch (ParseException e ) {
      e.printStackTrace();
  }


  return row;
 }
}

  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.hawkcentral);

      btn1 = (Button) findViewById(R.id.hawknation_button);
      btn1.setOnClickListener(this);

      btn2 = (Button) findViewById(R.id.hawkcentral_button);
      btn2 .setOnClickListener(this);

      btn3 = (Button) findViewById(R.id.hawkeyesports_button);
      btn3 .setOnClickListener(this);

      espn = (Button) findViewById(R.id.espn_button);

      feedTitle = (TextView)findViewById(R.id.feedtitle);
      feedDescribtion = (TextView)findViewById(R.id.feeddescribtion);
      feedPubdate = (TextView)findViewById(R.id.feedpubDate);
      feedLink = (TextView)findViewById(R.id.feedlink);

           readRss();
       }

       private void readRss(){

      feedTitle.setText("--- wait ---");
      feedDescribtion.setText("");
      feedPubdate.setText("");
      feedLink.setText("");
      setListAdapter(null);

      Toast.makeText(this, "Reading RSS, Please wait.", Toast.LENGTH_LONG).show();


       try {
          URL rssUrl = new URL("http://www.sports.com/feed");
          SAXParserFactory mySAXParserFactory = SAXParserFactory.newInstance();
          SAXParser mySAXParser = mySAXParserFactory.newSAXParser();
          XMLReader myXMLReader = mySAXParser.getXMLReader();
          RSSHandler myRSSHandler = new RSSHandler();
          myXMLReader.setContentHandler(myRSSHandler);
          InputSource myInputSource = new InputSource(rssUrl.openStream());
          myXMLReader.parse(myInputSource);

          myRssFeed = myRSSHandler.getFeed();

         } catch (MalformedURLException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
         } catch (ParserConfigurationException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
         } catch (SAXException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
         } catch (IOException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
         }

         if (myRssFeed!=null)
         {
          TextView feedTitle = (TextView)findViewById(R.id.feedtitle);
          TextView feedDescribtion = (TextView)findViewById(R.id.feeddescribtion);
          TextView feedPubdate = (TextView)findViewById(R.id.feedpubDate);
          TextView feedLink = (TextView)findViewById(R.id.feedlink);
          feedTitle.setText(myRssFeed.getTitle());
          feedDescribtion.setText(myRssFeed.getDescription());
          feedPubdate.setText(myRssFeed.getPubdate());
          feedLink.setText(myRssFeed.getLink());

          MyCustomAdapter adapter =
           new MyCustomAdapter(this, R.layout.row, myRssFeed.getList());
          setListAdapter(adapter);
         }
         }       


@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
 // TODO Auto-generated method stub
 Intent intent = new Intent(this,HawkCentralDetails.class);
 Bundle bundle = new Bundle();
 bundle.putString("keyTitle", myRssFeed.getItem(position).getTitle());
 bundle.putString("keyDescription", myRssFeed.getItem(position).getDescription());
 bundle.putString("keyLink", myRssFeed.getItem(position).getLink());
 bundle.putString("keyPubdate", myRssFeed.getItem(position).getPubdate());
 intent.putExtras(bundle);
      startActivity(intent);
}

Ответы [ 3 ]

0 голосов
/ 17 июня 2011

Вам нужно вызывать readRSS () в отдельном потоке, так как oncreate поставляется с ограничением по времени. Вы можете использовать поток для получения rss и обновления пользовательского интерфейса, поместив его в поток пользовательского интерфейса или используя асинхронную задачу

см http://developer.android.com/resources/articles/painless-threading.html

0 голосов
/ 17 июня 2011

Либо вы можете использовать asynctask, либо использовать следующий код, который использует очередь сообщений, чтобы убедиться, что контент показывается пользователю только тогда, когда он полностью загружен из веб-запроса и, поскольку он работает в отдельном потоке, графический интерфейс не приостановлен также: InputSource myInputSource;

public void sampleFunction()
    {


        progressDialog = ProgressDialog.show(this, "", "Getting data...");
        new Thread() {
            public void run() {
                try {
                    //do the web request to get the feeds
                   myInputSource = new InputSource(rssUrl.openStream());
                }catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                messageHandler.sendEmptyMessage(0);
                //              messageHandler.sendEmptyMessage(0);
            }
        }.start();
    }
}


//inside the handler set the string array retrieved from the WS in sampleFunction to the adapter
private Handler messageHandler = new Handler() {

        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            //here write the code to parse the value stored in myInputSource 

        }
    };
0 голосов
/ 17 июня 2011

Вы должны попробовать использовать AsyncTask , это поможет перейти по ссылке ниже

http://developer.android.com/reference/android/os/AsyncTask.html

С AsyncTask вы можете загрузить данные в фоновом режиме и отображаетсяпри загрузке до времени вы можете отобразить ProgressDialog

...