我有一个Android应用程序,我只想在列表视图中显示来自RSS提要的文本。应用程序仅在我以调试模式运行时检索Feed,并在Main活动中的某些行上使用断点。
我异步检索Feed,这可能是导致这种情况发生的原因之一,但我不太确定如何在没有调试器的情况下运行应用程序时立即显示Feed。
以下是主要活动:
public class MainActivity extends ListActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ArrayList<String> headlines = new ArrayList<>();
RetrieveFeed getXML = new RetrieveFeed();
getXML.execute();
headlines = getXML.heads();
// Binding data
ArrayAdapter adapter = new ArrayAdapter(this,
android.R.layout.simple_list_item_1, headlines);
setListAdapter(adapter);
}}
以下是在后台进行背景检索的类:
public class RetrieveFeed extends AsyncTask {
URL url;
ArrayList<String> headlines = new ArrayList();
ArrayList<String> links = new ArrayList();
@Override
protected Object doInBackground(Object[] params) {
try {
//does specific stuff here :)
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return headlines;
}
private InputStream getInputStream(URL url) {
try {
return url.openConnection().getInputStream();
} catch (IOException e) {
return null;
}
}
public ArrayList<String> heads()
{
return headlines;
}}
答案 0 :(得分:3)
问题是您在AsyncTask
完成之前尝试访问数据。
getXML.execute();
headlines = getXML.heads();
// you execute your AsyncTask here and try to access it's data
// immediately, without waiting for it to finish execution
要解决此问题,您需要覆盖onPostExecute()
中的AsyncTask
(在doInBackground()
完成后调用)并从那里填充/刷新ListView
。
您可以使RetrieveFeed
成为MainActivity
的内部类,这样您就可以直接访问ListView
,或通过界面实现回调机制。
如果您选择后者,请查看this answer以获取示例。
要在执行期间显示ProgressDialog
,您也应该覆盖onPreExecute()
。从那里显示您的对话框并在onPostExecute()
中将其关闭。
检查this answer以获取示例。