繁体   English   中英

Android App首次启动时显示空白屏幕,但重新启动时显示内容

[英]Android App showing blank screen on first launch but showing the content on relaunch

我是android应用程序开发的新手。

我面临的问题是,在第一次运行时,我的应用程序显示空白屏幕,当我关闭它并立即重新打开它时,它可以正常工作。

我想知道为什么它不会在第一时间加载。

任何帮助深表感谢....

应用详细信息:

我编写了一个应用程序来读取XML源并将其显示在屏幕上。 为了显示,我动态创建了LinearLayout,ScrollView,按钮和文本视图。 我曾使用async任务通过SAX Parser读取XML数据。

MainActivity.Java

package com.example.thehindu_topstories;
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import android.net.ParseException;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.Color;
import android.text.Html;
import android.text.method.LinkMovementMethod;
import android.view.Menu;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;

public class MainActivity extends Activity
{
NewsList newsList = null;

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

    ScrollView sv = new ScrollView(this);
    LinearLayout layout = new LinearLayout(this);       



    sv.addView(layout);


    layout.setOrientation(LinearLayout.VERTICAL);



    new FetchFeed().execute();


    Button title[];
    TextView pubDate[];


    newsList = NewsXMLHandler.newsList;
    title = new Button[newsList.getTitle().size()];

    pubDate = new TextView[newsList.getpubDate().size()];

    for (int i = 1; i <= (newsList.getTitle().size()); i++)
    {

        try{

                title[i] = new Button(this);
                title[i].setText(i+"."+newsList.getTitle().get(i)+"\n");

                title[i].append(Html.fromHtml( String.format("<a href=\"%s\">(..Read more..)</a> ",newsList.getLink().get(i))));
                title[i].setMovementMethod(LinkMovementMethod.getInstance());

                title[i].setBackgroundColor(Color.LTGRAY);
                pubDate[i]= new TextView(this);
                pubDate[i].setText(newsList.getpubDate().get(i)+"\n");

                pubDate[i].setTextSize(10);

                layout.addView(title[i]);

                layout.addView(pubDate[i]);

            }
            catch(Exception e)
            {
                    System.out.println(e.toString());
            }
        }
    setContentView(sv); 
}

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

private class FetchFeed extends AsyncTask<Void, Void, Void>
{

    protected Void doInBackground(Void... params)
    {
        try
        {
            SAXParserFactory spf=SAXParserFactory.newInstance();
            SAXParser sp= spf.newSAXParser();
            XMLReader xr = sp.getXMLReader();
            URL SourceUrl = new URL ("http://beta.thehindu.com/news/?service=rss");

            NewsXMLHandler myXMLHandler = new NewsXMLHandler();
            xr.setContentHandler(myXMLHandler);
            xr.parse(new InputSource(SourceUrl.openStream()));
        }
        catch (ParseException e)
        {
            System.out.println("XML Parsing Exception="+ e);
        }

        catch (MalformedURLException e)
        {
            System.out.println("XML Parsing Exception="+ e);
        }
        catch (Exception e)
        {
            System.out.println("XML Parsing Exception="+ e);
        }
        return null;
        /**/
    }
    protected void onPostExecute(Void param)
            {

    }

}
}

NewsList.Java

package com.example.thehindu_topstories;

import java.util.ArrayList;

public class NewsList
{
private ArrayList<String> title = new ArrayList<String>();
private ArrayList<String> link = new ArrayList<String>();
private ArrayList<String> pubDate = new ArrayList<String>();

public ArrayList<String> getTitle()
{
    return title;
}

public void setTitle(String title)
{
    this.title.add(title);
}

public ArrayList<String> getLink()
{
    return link;
}

public void setLink(String link)
{
    this.link.add(link);
}


public ArrayList<String> getpubDate()
{
    return pubDate;
}

public void setpubDate(String pubDate)
{
    this.pubDate.add(pubDate);
}

}

NewsXMLHandler.java

package com.example.thehindu_topstories;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class NewsXMLHandler extends DefaultHandler
{


Boolean currentElement = false;
String currentValue = null;
public static NewsList newsList = new NewsList();

public static NewsList getNewsList()
{
return newsList;
}

public static void setNewsList(NewsList newsList)
{
    NewsXMLHandler.newsList = newsList;
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException
{

    currentElement = true;

    if (localName.equals("channel"))
    {
        newsList = new NewsList();
    }

}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException
{

    currentElement = false;

    if (localName.equalsIgnoreCase("title"))
        newsList.setTitle(currentValue);
    else if (localName.equalsIgnoreCase("link"))
        newsList.setLink(currentValue);
    else if (localName.equalsIgnoreCase("pubDate"))
        newsList.setpubDate(currentValue);


}

@Override
public void characters(char[] ch, int start, int length)
throws SAXException
{

    if (currentElement)
    {
        currentValue = new String(ch, start, length);
        currentElement = false;
    }

}



}

activity_main.xml中

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >


</RelativeLayout>

您正在onCreate中使用FetchFeed任务,但是在开始填充数据之前,您并没有等待它完成(因此,在生成视图时,NewsList单例仍然具有空数组)。 由于您使用的是一个可以在关闭“活动”后幸存的单例,因此第二次打开您的应用程序时该窗口将可见。 到第二次打开“活动”时,任务已经完成,因此在调用onCreate()之前,NewsList中已经有数据。

您需要将所有位于new FetchFeed().execute();下面的代码移到new FetchFeed().execute(); 在onCreate()到FetchFeed任务的onPostExecute(Void param)中。

在onCreate()中删除了代码的地方,可以用显示进度条视图的代码替换它。

试试这个代码:

package com.example.thehindu_topstories;
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import android.net.ParseException;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.Color;
import android.text.Html;
import android.text.method.LinkMovementMethod;
import android.view.Menu;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;

public class MainActivity extends Activity
{
NewsList newsList = null;

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

    ScrollView sv = new ScrollView(this);
    LinearLayout layout = new LinearLayout(this);       

    setContentView(sv); 


    sv.addView(layout);


    layout.setOrientation(LinearLayout.VERTICAL);



    new FetchFeed().execute();

}

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

private class FetchFeed extends AsyncTask<Void, Void, Void>
{

    protected Void doInBackground(Void... params)
    {
        try
        {
            SAXParserFactory spf=SAXParserFactory.newInstance();
            SAXParser sp= spf.newSAXParser();
            XMLReader xr = sp.getXMLReader();
            URL SourceUrl = new URL ("http://beta.thehindu.com/news/?service=rss");

            NewsXMLHandler myXMLHandler = new NewsXMLHandler();
            xr.setContentHandler(myXMLHandler);
            xr.parse(new InputSource(SourceUrl.openStream()));
        }
        catch (ParseException e)
        {
            System.out.println("XML Parsing Exception="+ e);
        }

        catch (MalformedURLException e)
        {
            System.out.println("XML Parsing Exception="+ e);
        }
        catch (Exception e)
        {
            System.out.println("XML Parsing Exception="+ e);
        }
        return null;
        /**/
    }
    protected void onPostExecute(Void param)
            {

    Button title[];
    TextView pubDate[];


    newsList = NewsXMLHandler.newsList;
    title = new Button[newsList.getTitle().size()];

    pubDate = new TextView[newsList.getpubDate().size()];

    for (int i = 1; i <= (newsList.getTitle().size()); i++)
    {

        try{

                title[i] = new Button(this);
                title[i].setText(i+"."+newsList.getTitle().get(i)+"\n");

                title[i].append(Html.fromHtml( String.format("<a href=\"%s\">(..Read more..)</a> ",newsList.getLink().get(i))));
                title[i].setMovementMethod(LinkMovementMethod.getInstance());

                title[i].setBackgroundColor(Color.LTGRAY);
                pubDate[i]= new TextView(this);
                pubDate[i].setText(newsList.getpubDate().get(i)+"\n");

                pubDate[i].setTextSize(10);

                layout.addView(title[i]);

                layout.addView(pubDate[i]);

            }
            catch(Exception e)
            {
                    System.out.println(e.toString());
            }
        }
    }

}
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM