在初始屏幕中执行另一个 activity(不是主 activity)的异步任务

Perform Async task of another activity (other than main activity) in Splash screen

我有一个主 activity [Activity A(打开应用程序时显示)],它包含一个按钮(按钮 1)

单击按钮 1 时,会打开一个新的 activity(Activity B) 。 Activity B 包含一个使用异步任务加载的列表视图

现在我想在我的应用程序中添加启动画面,以便在 Activity B 中执行的异步任务是通过启动画面的异步任务以及何时完成的用户点击 Button 1 ,显示 Activity B 并且列表视图已经加载

这可能吗?

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

我的代码

activity A 的按钮 1 的 onclicklistener

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

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

           startActivity(i);
          )

});

ActivityB 的异步任务加载列表视图

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;
    }

我建议你换一种方式:

您可以将 SplashScreen 放入 ActivityB 布局文件中。你只需放一张图片、一张 gif 或任何你喜欢的东西,然后把它放在屏幕前面,总是可见的。

当您的异步任务完成时,您只需调用 mySplashImage.setVisibility(View.GONE),技巧就完成了。

如果您几乎不想要不同的启动画面Activity或者这种方式是否适合您,请告诉我:)

编辑:

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

1- 使用 parcelable:

看看 this question. They ask pretty the same thing and they explain how to use parcelable in objects. You just have to make your object implements Parcelable (here is the official doc)。然后你可以使用

传递它

Intent i = new Intent();

i.putExtra("name_of_extra", myParcelableObject);

从第二个开始Activity

getIntent().getParcelableExtra()

2- 使用字符串

这更像是一个“解决方法”,但如果您不想让您的对象实现 parcelable,您可以将它序列化为一个字符串,使用 putExtra 传递它,使用 [= 检索它16=] 然后反序列化它。

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

编辑 2

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

here is the official doc of AsyncTask 如果你需要它,无论如何你创建的asynctask方法的第三个参数类型是你的doInBackground方法的return类型.现在你使用了 void, void, void ,这意味着你的 asyncTask 的任何方法都不会 return 什么。

here is an easy example 关于如何使用它: 我试着把你的编辑成 return 东西 :)

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);

}

而在新的 Activity 中:

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

asyncTask 的问题是 doInBackground 在后台工作,正如它所说的那样。因此,您不能在 activity 中使用此方法中的对象,也不能启动活动或其他类似的东西。

onPreExecuteonPostExecute中,你可以做任何事情,因为它们是在UI线程中调用的。

所以现在您必须使用您获得的参数在 onPostExecute 中启动下一个 activity 并且工作完成:)

有任何问题我都在这里

编辑 3

我用你的 doInBackground 更新了代码。由于您获得了项目的 ArrayList,因此您应该在所需的对象上使用 as they mentioned in this question the serializable 属性。

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