Java 带有异步任务的启动屏幕

Java 带有异步任务的启动屏幕,java,android,android-asynctask,splash-screen,Java,Android,Android Asynctask,Splash Screen,我想在我的应用程序中实现一个启动屏幕。我已经这么做了。但目前它只等待3秒钟,然后调用MainActivity类。问题是我有数据要加载,而在当前设置下,用户必须等待两次。我想要一个加载所有数据的启动屏幕。我有一个MainActivity课程,在那里一切都会发生,我还有我的SplashScreen课程 我想在后台运行的方法在我的main类中。所以基本上我有这样的闪屏课程 public class SplashScreenActivity extends AsyncTask<Void, Void

我想在我的应用程序中实现一个启动屏幕。我已经这么做了。但目前它只等待3秒钟,然后调用MainActivity类。问题是我有数据要加载,而在当前设置下,用户必须等待两次。我想要一个加载所有数据的启动屏幕。我有一个MainActivity课程,在那里一切都会发生,我还有我的SplashScreen课程

我想在后台运行的方法在我的main类中。所以基本上我有这样的闪屏课程

public class SplashScreenActivity extends AsyncTask<Void, Void, Void> {

@Override
protected Void doInBackground(Void... params) {
    // TODO Auto-generated method stub
    return null;
}

protected void onPostExecute(Void... params) {
    // TODO Auto-generated method stub

}

protected void onCancelled() {
    // TODO Auto-generated method stub
}

}
然后在方法中,我将编写
mA.parseXMLfromURL()

然后我会像这样在onPostExecute方法中启动一个主类的意图

protected void onPostExecute(Void... params) {
    Intent mainClass = new Intent(SplashScreenActivity.this, MainActivity.class);
    startActivity(mainClass);

}
如果需要更多的信息,我将乐意进一步阐述

更新

嗯,在你的评论之后,我尝试了一点不同的方法

这是我的oncreate方法

    public void onCreate(Bundle savedInstanceState) {
    StrictMode.setThreadPolicy(policy);
    super.onCreate(savedInstanceState);
    sv      = new ScrollView(this);
    layout = new LinearLayout(this);
    layout.setOrientation(LinearLayout.VERTICAL);
    sv.addView(layout);
    setContentView(sv);     

    new SplashScreenActivity().execute("URL TO FILE");
}
这就是我们的活动

public class SplashScreenActivity extends AsyncTask<String, Void, Void> {
public MainActivity mA = new MainActivity();

protected void onPostExecute(Void... params) {
}

protected void onCancelled() {
    // TODO Auto-generated method stub
}

@Override
protected Void doInBackground(String... params) {
    mA.parseXMLfromURL(params);
    return null;
}
}

有了这些代码,应用程序就在启动屏幕上出现了问题。我的XML解析似乎有问题。下面是XML解析代码。请注意,当我在没有启动屏幕的情况下启动主活动时,它可以正常工作

第三次更新

我刚开始调试,每行设置断点。它从这条线跳出来

rankingDate [k]             = new TextView(this);
代码的其余部分

for(int k = 0; k < metaList.getLength(); k++){

            Node metaNode = metaList.item(k);
            System.out.println(metaList.getLength());
            rankingDate [k]             = new TextView(this);
            rdate       [k]             = new TextView(this);
            numberOE    [k]             = new TextView(this);

            Element metaElement = (Element) metaNode;
            NodeList rankingDateList    = metaElement.getElementsByTagName("date");
            Element rankingDateElement  = (Element) rankingDateList.item(0);
            rankingDateList             = rankingDateElement.getChildNodes();
            rankingDate [k].setText("RankingDate: " + ((Node) rankingDateList.item(0)).getNodeValue());
            layout.addView(rankingDate[k]);

            xmlSerializer.startTag(null, "date");
            xmlSerializer.text(((Node) rankingDateList.item(0)).getNodeValue());
            xmlSerializer.endTag(null, "date");

        }
for(int k=0;k

system.out.println给我1。k是0。那么为什么它是空指针异常呢?

您应该为SplashScreen创建新活动-->SplashScreenActivity扩展活动,在清单中声明,然后设置布局

public SplashScreenActivity extends Activity{

 protected void onCreate(Bundle ...){
  super.onCreate(...);
  setContentView(...);
  new mTask().execute();
 }

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

@Override
protected Void doInBackground(Void... params) {
    // TODO Auto-generated method stub
    return null;
}

protected void onPostExecute(Void... params) {
   Intent mainClass = new Intent(SplashScreenActivity.this, MainActivity.class);
    startActivity(mainClass);
    finish();
}

 }

}
公共活动扩展活动{
创建时受保护的空(捆绑…){
super.onCreate(…);
setContentView(…);
新建mTask().execute();
}
私有类mTask扩展异步任务{
@凌驾
受保护的Void doInBackground(Void…参数){
//TODO自动生成的方法存根
返回null;
}
受保护的void onPostExecute(void…参数){
Intent mainClass=新的Intent(SplashScreenActivity.this,MainActivity.class);
星触觉(主类);
完成();
}
}
}

您应该为SplashScreen创建新活动-->SplashScreenActivity扩展活动,在清单中声明,然后设置布局

public SplashScreenActivity extends Activity{

 protected void onCreate(Bundle ...){
  super.onCreate(...);
  setContentView(...);
  new mTask().execute();
 }

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

@Override
protected Void doInBackground(Void... params) {
    // TODO Auto-generated method stub
    return null;
}

protected void onPostExecute(Void... params) {
   Intent mainClass = new Intent(SplashScreenActivity.this, MainActivity.class);
    startActivity(mainClass);
    finish();
}

 }

}
公共活动扩展活动{
创建时受保护的空(捆绑…){
super.onCreate(…);
setContentView(…);
新建mTask().execute();
}
私有类mTask扩展异步任务{
@凌驾
受保护的Void doInBackground(Void…参数){
//TODO自动生成的方法存根
返回null;
}
受保护的void onPostExecute(void…参数){
Intent mainClass=新的Intent(SplashScreenActivity.this,MainActivity.class);
星触觉(主类);
完成();
}
}
}

启动屏幕的一种更简单的方法是将其显示在需要使用加载数据的主要活动之前。最简单的方法是重写AsyncTask中的onPreExecute()方法。下面是一个简单的启动屏幕示例

MainActivity.java

public class MainActivity extends Activity
{
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        new SplashScreen(this).execute();
    }
}
SplashScreen.java

public class SplashScreen extends AsyncTask<Void, Void, Void>
{
    Context ctxt;
    Dialog splash;

    public SplashScreen(Context ctxt)
    {
        this.ctxt = ctxt;
    }

    protected void onPreExecute()
    {
        splash = new Dialog(ctxt, R.style.full_screen);
        splash.show();
    }

    protected Void doInBackground(Void... ignore)
    {
        //Fetch stuff
        return null;
    }

    protected void onPostExecute(Void ignore)
    {
        splash.dismiss();
    }
}
公共类SplashScreen扩展异步任务
{
上下文ctxt;
对话飞溅;
公共SplashScreen(上下文ctxt)
{
this.ctxt=ctxt;
}
受保护的void onPreExecute()
{
splash=新对话框(ctxt,R.style.full_屏幕);
splash.show();
}
受保护的Void doInBackground(Void…忽略)
{
//拿东西
返回null;
}
受保护的void onPostExecute(void忽略)
{
splash.dispose();
}
}
在res/values/styles.xml文件中,您希望全屏显示以下xml

<!-- Stuff that's already in here -->

<style name="full_screen" parent="android:Theme.Light">
    <item name="android:windowActionBar">false</item>
    <item name="android:windowNoTitle">true</item>
</style>

<!-- Stuff that's already in here -->

假的
真的
这将为您提供一个非常基本的启动屏幕(即,一个没有任何内容的空白屏幕)。如果查看Dialogs API,您可以找到其他自定义方法,允许您使用图片而不是文本,以及完全自定义对话框的布局。如果您想要进一步的定制,也要考虑一下。以这种方式启动屏幕的好处是,您可以检索所有信息,并在onPostExecute()中将其设置到MainActivity,而无需担心数据传输问题


希望这有帮助!祝你好运。

启动屏幕的一个简单方法是将其显示在需要使用加载数据的主要活动之前。最简单的方法是重写AsyncTask中的onPreExecute()方法。下面是一个简单的启动屏幕示例

MainActivity.java

public class MainActivity extends Activity
{
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        new SplashScreen(this).execute();
    }
}
SplashScreen.java

public class SplashScreen extends AsyncTask<Void, Void, Void>
{
    Context ctxt;
    Dialog splash;

    public SplashScreen(Context ctxt)
    {
        this.ctxt = ctxt;
    }

    protected void onPreExecute()
    {
        splash = new Dialog(ctxt, R.style.full_screen);
        splash.show();
    }

    protected Void doInBackground(Void... ignore)
    {
        //Fetch stuff
        return null;
    }

    protected void onPostExecute(Void ignore)
    {
        splash.dismiss();
    }
}
公共类SplashScreen扩展异步任务
{
上下文ctxt;
对话飞溅;
公共SplashScreen(上下文ctxt)
{
this.ctxt=ctxt;
}
受保护的void onPreExecute()
{
splash=新对话框(ctxt,R.style.full_屏幕);
splash.show();
}
受保护的Void doInBackground(Void…忽略)
{
//拿东西
返回n
public void functionCalledOnDataLoaded(){
   //do you init stuff

  ((RelativeLayout) findViewById(R.id.overlay)).setVisibility(View.INVISIBLE);
  ((RelativeLayout) findViewById(R.id.mainActivity)).setVisibility(View.VISIBLE);