我正在为android开发一个rss阅读器,但我无法实现进度对话框。这是代码,
public class RSSReader extends Activity implements OnItemClickListener{
private static final int ACTIVITY_DESCRIPTION = 0;
private static final String MY_RSS = "http://www.xyz.com/rss/rss.xml";
private RSSFeed feed = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Typeface tf = Typeface.createFromAsset(getAssets(),
"font/SutonnyMJ.ttf");
TextView tv = (TextView) findViewById(R.id.footer);
tv.setTypeface(tf);
feed = getFeed(MY_RSS);
UpdateDisplay();
}
public void refresh()
{
feed = getFeed(MY_RSS);
UpdateDisplay();
}
//Menu
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
switch (item.getItemId()) {
case R.id.refresh:
refresh();
return true;
case R.id.about:
showDialog(1);
return true;
case R.id.end:
finish();
return true;
case R.id.tv:
Intent intentabout = new Intent(this,WebTV.class);
startActivity(intentabout);
return true;
default:
return super.onOptionsItemSelected(item);
//return true;
}
}
//About Dialog
protected Dialog onCreateDialog(int id) {
final Dialog dialog = new Dialog(this);
switch(id){
case 1:
dialog.setContentView(R.layout.about);
dialog.setTitle("About");
TextView text = (TextView) dialog.findViewById(R.id.text);
ImageView image = (ImageView) dialog.findViewById(R.id.image);
image.setImageResource(R.drawable.logobn24);
Button button = (Button) dialog.findViewById(R.id.cancel);
button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
dialog.cancel();
}
});
break;
default:
//dialog = null;
}
return dialog;
}
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
Intent i = new Intent(this, ShowDescription.class);
RSSItem item = feed.getItem(position);
i.putExtra("title", item.getTitle());
i.putExtra("description", item.getDescription());
i.putExtra("link", item.getLink());
i.putExtra("pubdate", item.getPubdate());
startActivityForResult(i, ACTIVITY_DESCRIPTION);
}
private void UpdateDisplay() {
TextView feedTitle = (TextView) findViewById(R.id.feedtitle);
Typeface tf = Typeface.createFromAsset(getAssets(),
"font/SutonnyMJ.ttf");
feedTitle.setTypeface(tf);
TextView feedPubdate = (TextView) findViewById(R.id.feedpubdate);
ListView itemList = (ListView) findViewById(R.id.itemlist);
if (feed == null) {
LayoutInflater inflater = getLayoutInflater();
View layout = inflater.inflate(R.layout.toast_layout,
(ViewGroup) findViewById(R.id.toast_layout_root));
ImageView image = (ImageView) layout.findViewById(R.id.image);
image.setImageResource(R.drawable.alert);
TextView text = (TextView) layout.findViewById(R.id.text);
text.setTypeface(tf);
text.setText("Avi Gm Gm cvIqv hvqwb, `qv K‡i B›Uvi‡b‡Ui jvBb wbwðZ Kiæb!");
Toast toast = new Toast(getApplicationContext());
toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
toast.setDuration(Toast.LENGTH_LONG);
toast.setView(layout);
toast.show();
//Toast.makeText(this,"No RSS Feed Available", Toast.LENGTH_LONG).show();
return;
}
//feedTitle.setText(feed.getTitle());
feedTitle.setText("msev` we‡bv`b mviv¶Y");
feedPubdate.setText(feed.getPubdate());
//ArrayAdapter<RSSItem> adapter = new ArrayAdapter<RSSItem>(this,
//android.R.layout.simple_list_item_1, feed.getAllItems());
ArrayAdapter<RSSItem> adapter = new OrderAdapter<RSSItem>(this,
R.layout.rsslist,feed.getAllItems());
itemList.setAdapter(adapter);
itemList.setSelection(0);
itemList.setOnItemClickListener(this);
}
private RSSFeed getFeed(String urlToRssFeed) {
try {
URL url = new URL(urlToRssFeed);
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
XMLReader xmlReader = parser.getXMLReader();
RSSHandler rssHandler = new RSSHandler();
xmlReader.setContentHandler(rssHandler);
InputSource is = new InputSource(url.openStream());
xmlReader.parse(is);
return rssHandler.getFeed();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
我想添加一个进程对话框,比如加载....以便耗时的方法UpdateDisplay()可以在后台运行。任何人都可以帮助我吗?
答案 0 :(得分:1)
您需要使用AsyncTask
。我正在从here获取代码并进行一些修改:
public class ProgressTask extends AsyncTask<Void, Void, Boolean> {
/** progress dialog to show user that the backup is processing. */
private ProgressDialog dialog;
/** application context. */
private Activity activity;
public ProgressTask(RSSReader activity) {
this.activity = activity;
dialog = new ProgressDialog(context);
}
protected void onPreExecute() {
this.dialog.setMessage("Progress start");
this.dialog.show();
}
@Override
protected void onPostExecute(final Boolean success) {
if (dialog.isShowing()) {
dialog.dismiss();
}
}
protected Boolean doInBackground(final Void... args) {
UpdateDisplay(); //here go the operations you want executed in the background
}
}
然后在您的活动中,您只需通过以下方式致电:AsyncTask task = new ProgressTask(this).execute();
答案 1 :(得分:0)
使用asynctask类
public class getRSS extends AsyncTask<Void, Void, Void> {
ProgressDialog progressDialog;
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog = new ProgressDialog(actvity.this);
progressDialog.setMessage("Please wait.....");
progressDialog.setTitle("Loading...");
progressDialog.setCancelable(false);
progressDialog.show();
}
@Override
protected Void doInBackground(Void... params) {
// here code to call rss webservice
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
//parse rss service here and also display here
if (progressDialog != null && progressDialog.isShowing())
progressDialog.dismiss();
}
}