在启动画面

时间:2016-03-02 08:43:43

标签: android listview android-asynctask splash-screen

我有一个主要活动[活动A (在应用程序打开时显示)],其中包含一个按钮(按钮1

单击按钮1时,会打开一个新活动(活动B )。活动B由使用异步任务

加载的列表视图组成

现在我想在我的应用中添加一个启动画面,以便在活动B 中执行的异步任务通过启动画面的异步任务完成,当用户点击按钮1时活动B 与列表视图已加载一起显示

这可能吗?

我知道如何设置启动画面并在其中使用Async任务

我的代码

活动A的按钮1的onclicklistener

btn.setOnClickListener(new OnClickListener(){
     @Override
          public void onClick(View v){

            Intent i = new Intent(ActivityA.this, ActivityB.class);

           startActivity(i);
          )

});

活动B的异步任务加载列表视图

private class RemoteDataTask extends AsyncTask<Void, Void, Void> {
    @Override
    protected void onPreExecute() {
        super.onPreExecute();


        mProgressDialog = new ProgressDialog(ActivityB.this);
        mProgressDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);

        // Set progressdialog message
        mProgressDialog.setMessage("Loading. Please wait loading ....");
        mProgressDialog.setIndeterminate(true);
        mProgressDialog.setCancelable(false);

        // Show progressdialog
        mProgressDialog.show();

    }


    @Override
    protected Void doInBackground(Void... params) {
        //my background process to load listview
    }

    @Override
    protected void onPostExecute(Void result) {
    istview = (ListView) findViewById(R.id.activityb_layoutListView);


        adapter = new MyAdapter(ActivityB.this, delist)


        // Binds the Adapter to the ListView
    listview.setAdapter(adapter);


 }
  }

我的doinbackground()

protected Void doInBackground(Void... params) {
        // Create the array
        delist = new ArrayList<CodeList>();
        try {

            ParseQuery<ParseObject> query = new ParseQuery<ParseObject>(
                "terActivity");
            // Locate the column named "ranknum" in Parse.com and order list
            // by ascending
            query.orderByAscending("_created_at");

            ob = query.find();
            for (ParseObject inter : ob) {
                Delist map = new Delist();

                map.setIntroduction((String) inter.get("intro"));


                delist.add(map);
            }
        } catch (ParseException e) {
            Log.e("Error", e.getMessage());
            e.printStackTrace();
        }
        return null;
    }

1 个答案:

答案 0 :(得分:3)

我建议你采用不同的方式:

您可以将SplashScreen放入 ActivityB 布局文件中。你只需要放置一个图像,或者一个gif或者你喜欢的任何东西,然后将它放在屏幕的前面,一直可见。

当异步任务完成后,您只需调用mySplashImage.setVisibility(View.GONE)即可完成操作。

如果你几乎不想要一个不同的splashscreen活动或者这种方式对你好吗,请告诉我:))

修改

由于您希望在应用程序启动时加载数据并将其传递给下一个活动,您有两种方法:

1-使用parcelable

看看this question。他们提出了同样的问题并解释了如何在对象中使用parcelable。您只需要使对象实现Parcelablehere is the official doc)。然后你可以使用

传递它
  

Intent i = new Intent();

     

i.putExtra(&#34; name_of_extra&#34;,myParcelableObject);

来自第二个活动

  

getIntent()。getParcelableExtra()

2-使用字符串

这是一个&#34;解决方法&#34;,但是如果你不想使你的对象实现可分割,你可以将它序列化为一个字符串,使用putExtra传递它,使用getStringExtra()检索它,然后反序列化。

我几乎没有推荐Parcelable方式,因为它是出于这个原因创建的,但我给了你两种方式让你可以选择:)

编辑2

如果您想在活动中使用doInBackground()中加载的数据,则需要将其作为结果传递给onPostExecute方法。

here is the official doc AsyncTask以防您需要它,无论如何,您创建的asynctask方法的第三个参数类型是doInBackground方法的返回类型。现在您使用了void, void, void,这意味着您的asyncTask方法中没有人会返回任何内容。

here is an easy example如何使用它: 我尝试编辑你的东西:)

private class RemoteDataTask extends AsyncTask<Void, Void, ArrayList<CodeList>> {
@Override
protected void onPreExecute() {
    super.onPreExecute();


    mProgressDialog = new ProgressDialog(ActivityB.this);
    mProgressDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);

    // Set progressdialog message
    mProgressDialog.setMessage("Loading. Please wait loading ....");
    mProgressDialog.setIndeterminate(true);
    mProgressDialog.setCancelable(false);

    // Show progressdialog
    mProgressDialog.show();

}


@Override
protected ArrayList<CodeList> doInBackground(Void... params) {
    //my background process to load listview
    ArrayList<CodeList> delist = new ArrayList<CodeList>();
    try {

        ParseQuery<ParseObject> query = new ParseQuery<ParseObject>(
            "terActivity");
        // Locate the column named "ranknum" in Parse.com and order list
        // by ascending
        query.orderByAscending("_created_at");

        ob = query.find();
        for (ParseObject inter : ob) {
            Delist map = new Delist();

            map.setIntroduction((String) inter.get("intro"));


            delist.add(map);
        }
        return delist;
    } catch (ParseException e) {
        Log.e("Error", e.getMessage());
        e.printStackTrace();
    }
    return null;
}

@Override
protected void onPostExecute(ArrayList<CodeList> result) {
    //istview = (ListView) findViewById(R.id.activityb_layoutListView);
    //adapter = new MyAdapter(ActivityB.this)
    // Binds the Adapter to the ListView
    //listview.setAdapter(adapter);

    //here you use them
    //result are your objects returned from doInBackground.
    //now you can work with them as if you are in the onCreate
    If(result == null) { return; } 
    Intent intent = new Intent(SourceActivity.this, TargetActivity.class);
    Bundle args = new Bundle();
    args.putSerializable("ARRAYLIST",(Serializable)result);
    intent.putExtra("BUNDLE",args);
    startActivity(intent);

}

在新的活动中:

Intent intent = getIntent();
Bundle args = intent.getBundleExtra("BUNDLE");
ArrayList<CodeList> object = (ArrayList<CodeList>) args.getSerializable("ARRAYLIST");

asyncTask的问题在于doInBackground在后​​台工作,正如它所说的那样。你不能在你的活动中使用这个方法中的对象,你也不能开始这样的活动或其他东西。

onPreExecuteonPostExecute中,您可以执行所有操作,因为它们是在UI线程中调用的。

所以现在你必须使用你得到的参数启动onPostExecute中的下一个活动并完成工作:)

对于我在这里的任何问题

编辑3

我用你的doInBackground更新了代码。由于您有一个项目的ArrayList,您应该使用as they mentioned in this question所需对象的serializable属性。

我在这里手工编写了代码,因此可能需要进行一些调整,但它应该可以工作:)