我有一个主要活动[活动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;
}
答案 0 :(得分:3)
我建议你采用不同的方式:
您可以将SplashScreen
放入 ActivityB 布局文件中。你只需要放置一个图像,或者一个gif或者你喜欢的任何东西,然后将它放在屏幕的前面,一直可见。
当异步任务完成后,您只需调用mySplashImage.setVisibility(View.GONE)
即可完成操作。
如果你几乎不想要一个不同的splashscreen活动或者这种方式对你好吗,请告诉我:))
修改强>
由于您希望在应用程序启动时加载数据并将其传递给下一个活动,您有两种方法:
1-使用parcelable :
看看this question。他们提出了同样的问题并解释了如何在对象中使用parcelable。您只需要使对象实现Parcelable
(here 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
在后台工作,正如它所说的那样。你不能在你的活动中使用这个方法中的对象,你也不能开始这样的活动或其他东西。
在onPreExecute
和onPostExecute
中,您可以执行所有操作,因为它们是在UI线程中调用的。
所以现在你必须使用你得到的参数启动onPostExecute中的下一个活动并完成工作:)
对于我在这里的任何问题
编辑3
我用你的doInBackground更新了代码。由于您有一个项目的ArrayList,您应该使用as they mentioned in this question所需对象的serializable属性。
我在这里手工编写了代码,因此可能需要进行一些调整,但它应该可以工作:)