Android 我的listview仅在使用调试器时更新
每当我正常运行我的应用程序时,对于bnf片段,listfragment总是为空。但是,如果我在fetch stories方法之前设置一个断点并逐行遍历代码,listfragment就会更新!我粘贴的最后一个类是AsycntTask,它获取更新listview所用的所有数据。我想我在线程方面做了一些错误的事情,但我不确定到底发生了什么。值得一提的是,添加的第一个片段也是一个asynctask,可以正常工作Android 我的listview仅在使用调试器时更新,android,debugging,android-listfragment,Android,Debugging,Android Listfragment,每当我正常运行我的应用程序时,对于bnf片段,listfragment总是为空。但是,如果我在fetch stories方法之前设置一个断点并逐行遍历代码,listfragment就会更新!我粘贴的最后一个类是AsycntTask,它获取更新listview所用的所有数据。我想我在线程方面做了一些错误的事情,但我不确定到底发生了什么。值得一提的是,添加的第一个片段也是一个asynctask,可以正常工作 public class NasaAppActivity extends Activity
public class NasaAppActivity extends Activity implements ActionBar.TabListener{
private Bundle savedInstanceState;
private static View mainView;
private FragmentTransaction ft;
BreakingNewsFragment bnf; //a list fragment
NasaDailyImage ndi; //another fragment
@Override
public void onStart(){
super.onStart();
if(savedInstanceState==null){
ndi=new NasaDailyImage(this);
bnf=new BreakingNewsFragment(this);
ft=getFragmentManager().beginTransaction();
ft.add(R.id.focused_view_container,ndi).commit();
ft=getFragmentManager().beginTransaction();
ft.add(R.id.focused_view_container,bnf).commit();
}
public void onTabSelected(Tab tab, FragmentTransaction f) {
switch(tab.getPosition()){ //switches which fragment is visible
case 0:
ft=getFragmentManager().beginTransaction();
ft.hide(bnf);
ft.show(ndi);
ft.commit();
getFragmentManager().executePendingTransactions();
break;
case 1:
ft=getFragmentManager().beginTransaction();
ft.hide(ndi);
ft.show(bnf);
ft.commit();
bnf.fetchStories();
bnf.updateList(); //updates the list fragment
getFragmentManager().executePendingTransactions();
break;
}
}
}
@SuppressLint(“有效碎片”)
public类BreakingNewsFragment扩展ListFragment{
私人静态活动;
私有静态ArrayList stories=new ArrayList();
私有静态ArrayList storyTitles=新ArrayList();
public BreakingNewsFragment(){
}
public BreakingNewsFragment(活动mainActivity){
this.mainActivity=mainActivity;
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
//TODO自动生成的方法存根
返回super.onCreateView(充气机、容器、savedInstanceState);
}
@凌驾
public void onHiddenChanged(布尔隐藏){
//TODO自动生成的方法存根
super.onHiddenChanged(隐藏);
}
@凌驾
创建时的公共void(Bundle savedInstanceState){
//TODO自动生成的方法存根
super.onCreate(savedInstanceState);
}
公共新闻{
RssNewsParser parser=新的RssNewsParser(mainActivity);
parser.execute(“”);
stories=parser.getStories();
用于(故事:故事){
storyTitles.add(story.getTitle());
}
字符串结果;
结果=storyTitles.toString();
}
公共void updateList(){
字符串结果;
结果=storyTitles.toString();
setListAdapter(新的ArrayAdapter(mainActivity,android.R.layout.simple_list_item_1,storyTitles));
}
@凌驾
public void onStart(){
//TODO自动生成的方法存根
super.onStart();
}
}
公共类RssNewsParser扩展异步任务{
私人对话;
URL新闻URL;
ArrayList stories=新建ArrayList();
int事件类型;
int-storyCount=-1;
私人活动;
RssNewsParser(活动mainActivity){
this.mainActivity=mainActivity;
}
公共ArrayList getStories(){
回归故事;
}
@凌驾
受保护的void onPostExecute(ArrayList结果){
//TODO自动生成的方法存根
super.onPostExecute(结果);
dialog.hide();
//这个。取消(true);
}
@凌驾
受保护的void onPreExecute(){
//TODO自动生成的方法存根
super.onPreExecute();
dialog=ProgressDialog.show(mainActivity,“加载”、“加载新闻”);
}
@凌驾
受保护的ArrayList doInBackground(ArrayList…参数){
试一试{
newsURL=新URL(“http://www.nasa.gov/rss/breaking_news.rss“”;//设置URl
BufferedReader in=new BufferedReader(new InputStreamReader(newsURL.openStream());//获取rss
XmlPullParserFactory工厂;
factory=XmlPullParserFactory.newInstance();//新工厂
factory.setNamespaceAware(true);
XmlPullParser-xpp;
xpp=factory.newPullParser();
xpp.setInput(in);
eventType=xpp.getEventType();//返回一个表示不同内容的int(START\u文档、START\u标记等)
while(eventType!=XmlPullParser.END_DOCUMENT){//当文档有单词时
开关(事件类型){
case XmlPullParser.START_DOCUMENT://xml的开头
打破
case XmlPullParser.START_TAG://case:在新标记的开头
字符串标记名=xpp.getName();
if(标记名.equals(“项”)){
故事=新故事();
故事。添加(故事);
storyCount++;
xpp.getDepth();
}
if(标记名.equals(“title”)&&!stories.isEmpty()){
xpp.getDepth();
stories.get(storyCount).setTitle(xpp.nextText());
}
if(标记名.equals(“link”)&&!stories.isEmpty()){
stories.get(storyCount).setURL(xpp.nextText());
xpp.getDepth();
}
if(tagName.equals(“description”)&&!stories.isEmpty()){
stories.get(storyCount).setDescription(xpp.nextText());
xpp.getDepth();
}
打破
}
eventType=xpp.next();
}//开关
in.close();//close BufferedReader
}捕获(格式错误){
e、 printStackTrace();
}捕获(XmlPullParserException e1){
e1.printStackTrace();
}捕获(IOE2异常){
e2.printStackTrace();
}
回归故事;
}
}
我的listview仅在使用调试器时更新
这里
您将fetchStories方法视为一个阻塞调用。这意味着,您希望代码等待该方法完成,直到调用调用UpdateStores方法的下一行。但是,由于fetchStories是异步工作的,所以在调用UpdateStores时还没有完成 解决此问题的方法是从AsyncTask的onPostExecute方法调用UpdateStores。此方法的目的是允许您在任务完成其主要工作(放入doInBackground的内容)后,在启动AsyncTask的线程(通常是UI线程,因此您可以进行更新)上执行代码 它在调试时工作的原因是,您正在减慢代码的执行速度,使fetchStories能够在调用UpdateStores之前完成。在设备上,情况并非如此 简短回答,更新您的列表
@SuppressLint("ValidFragment")
public class BreakingNewsFragment extends ListFragment {
private static Activity mainActivity;
private static ArrayList<Story> stories=new ArrayList<Story>();
private static ArrayList<String> storyTitles=new ArrayList<String>();
public BreakingNewsFragment(){
}
public BreakingNewsFragment(Activity mainActivity){
this.mainActivity=mainActivity;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
return super.onCreateView(inflater, container, savedInstanceState);
}
@Override
public void onHiddenChanged(boolean hidden) {
// TODO Auto-generated method stub
super.onHiddenChanged(hidden);
}
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
}
public void fetchStories(){
RssNewsParser parser=new RssNewsParser(mainActivity);
parser.execute("");
stories=parser.getStories();
for(Story story:stories){
storyTitles.add(story.getTitle());
}
String result;
result = storyTitles.toString();
}
public void updateList(){
String result;
result = storyTitles.toString();
setListAdapter(new ArrayAdapter<String>(mainActivity,android.R.layout.simple_list_item_1,storyTitles));
}
@Override
public void onStart() {
// TODO Auto-generated method stub
super.onStart();
}
}
public class RssNewsParser extends AsyncTask<ArrayList<Story>,String,ArrayList<Story>>{
private ProgressDialog dialog;
URL newsURL;
ArrayList<Story> stories=new ArrayList<Story>();
int eventType;
int storyCount= -1;
private Activity mainActivity;
RssNewsParser(Activity mainActivity){
this.mainActivity=mainActivity;
}
public ArrayList<Story> getStories(){
return stories;
}
@Override
protected void onPostExecute(ArrayList<Story> result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
dialog.hide();
//this.cancel(true);
}
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
dialog=ProgressDialog.show(mainActivity, "Loading", "loading news");
}
@Override
protected ArrayList<Story> doInBackground(ArrayList<Story>... params) {
try{
newsURL = new URL("http://www.nasa.gov/rss/breaking_news.rss");//set URl
BufferedReader in = new BufferedReader(new InputStreamReader(newsURL.openStream()));//get rss
XmlPullParserFactory factory;
factory = XmlPullParserFactory.newInstance();//new factory
factory.setNamespaceAware(true);
XmlPullParser xpp;
xpp = factory.newPullParser();
xpp.setInput(in);
eventType = xpp.getEventType();//returns an int which mean different things (START_DOCUMENT,START_TAG,etc)
while(eventType!=XmlPullParser.END_DOCUMENT){//while the document has words
switch(eventType){
case XmlPullParser.START_DOCUMENT://beginning of xml
break;
case XmlPullParser.START_TAG://case : at beginning of new tag
String tagName=xpp.getName();
if(tagName.equals("item")){
Story story=new Story();
stories.add(story);
storyCount++;
xpp.getDepth();
}
if(tagName.equals("title")&& !stories.isEmpty()){
xpp.getDepth();
stories.get(storyCount).setTitle(xpp.nextText());
}
if(tagName.equals("link") && !stories.isEmpty()){
stories.get(storyCount).setURL(xpp.nextText());
xpp.getDepth();
}
if(tagName.equals("description")&& !stories.isEmpty()){
stories.get(storyCount).setDescription(xpp.nextText());
xpp.getDepth();
}
break;
}
eventType=xpp.next();
}//switch
in.close();//close BufferedReader
} catch (MalformedURLException e){
e.printStackTrace();
}catch(XmlPullParserException e1){
e1.printStackTrace();
}catch(IOException e2){
e2.printStackTrace();
}
return stories;
}
}
parser.execute("");
stories=parser.getStories(); //<<<<<<< here
@Override
protected void onPostExecute(ArrayList<Story> result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
// get data here
stories=getStories();
BreakingNewsFragment.this.setListAdapter(new ArrayAdapter<String>(mainActivity,
android.R.layout.simple_list_item_1,stories));
dialog.hide();
}