簡體   English   中英

在啟動畫面中執行另一個活動(主活動除外)的異步任務

[英]Perform Async task of another activity (other than main activity) in 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的異步任務加載listview

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) ,即可完成操作。

如果你幾乎不想要一個不同的splashscreen活動或者這種方式對你沒問題,請告訴我:)

編輯:

由於您希望在應用程序啟動時加載數據並將它們傳遞給下一個活動,因此您有兩種方法:

1-使用parcelable

看看這個問題 他們提出了同樣的問題並解釋了如何在對象中使用parcelable。 你只需要讓你的對象實現Parcelable這是官方文檔 )。 然后你可以使用它

意圖i =新的Intent();

i.putExtra(“name_of_extra”,myParcelableObject);

並從第二個活動

getIntent()。 getParcelableExtra()

2-使用字符串

這更像是一種“解決方法”,但是如果你不想讓你的對象實現可分解,你可以將它序列化為一個字符串,使用putExtra傳遞它,使用getStringExtra()檢索它,然后反序列化它。

我幾乎沒有推薦Parcelable方式,因為它是出於這個原因而創建的,但我給了你兩種方式讓你可以選擇:)

編輯2

如果要在活動中使用doInBackground()加載的數據,則需要將它們作為結果傳遞給onPostExecute方法。

下面是官方文檔AsyncTask的情況下你需要它,反正你創建的AsyncTask方法的第三個參數類型,是你的返回類型doInBackground方法。 現在你使用了void, void, void ,這意味着你的asyncTask方法中沒有人會返回任何內容。

這是一個如何使用它的簡單示例 :我嘗試編輯你的東西:)

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正如后面所說的doInBackground工作。 對此你不能在你的活動中使用此方法中的對象,也不能開始活動或其他類似的東西。

onPreExecuteonPostExecute ,您可以執行所有操作,因為它們是在UI線程中調用的。

所以現在你必須使用你得到的參數啟動onPostExecute中的下一個活動並完成工作:)

對於我在這里的任何問題

編輯3

我用你的doInBackground更新了代碼。 由於你有一個項目的ArrayList,你應該像他們在這個問題中提到的那樣使用你想要的對象的serializable屬性。

我在這里手工編寫代碼所以它可能需要一些調整,但它應該工作:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM