![](/img/trans.png)
[英]Launch another activity rather than mainactivity after splash screen
[英]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
工作。 對此你不能在你的活動中使用此方法中的對象,也不能開始活動或其他類似的東西。
在onPreExecute
和onPostExecute
,您可以執行所有操作,因為它們是在UI線程中調用的。
所以現在你必須使用你得到的參數啟動onPostExecute中的下一個活動並完成工作:)
對於我在這里的任何問題
編輯3
我用你的doInBackground更新了代碼。 由於你有一個項目的ArrayList,你應該像他們在這個問題中提到的那樣使用你想要的對象的serializable屬性。
我在這里手工編寫代碼所以它可能需要一些調整,但它應該工作:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.