Android 按顺序运行异步任务并共享同一布局
我目前正在从事一个项目,我有一个Android 按顺序运行异步任务并共享同一布局,android,android-layout,android-asynctask,Android,Android Layout,Android Asynctask,我目前正在从事一个项目,我有一个SplashScreen,它需要启动AsyncTask#1,然后启动AsyncTask#2到AsyncTask#5。完成所有这些操作后,它应将用户带到家庭活动 AsyncTask#1加载所有其他任务所需的数据。此外,我需要AsyncTask#2到AsyncTask#5共享相同的布局(图像视图+文本视图) 基本上,就像一个加载屏幕:TextView:“加载项目”和ImageView:当前正在加载的项目。即使图像将快速滚动,我仍然必须让用户看到加载/更改的图像 我手工
SplashScreen
,它需要启动AsyncTask#1
,然后启动AsyncTask#2
到AsyncTask#5
。完成所有这些操作后,它应将用户带到家庭活动
AsyncTask#1
加载所有其他任务所需的数据。此外,我需要AsyncTask#2
到AsyncTask#5
共享相同的布局(图像视图+文本视图)
基本上,就像一个加载屏幕:TextView:“加载项目”
和ImageView:当前正在加载的项目
。即使图像将快速滚动,我仍然必须让用户看到加载/更改的图像
我手工编写以下内容,因此忽略语法错误(如果有):/
当前,我的
splashScreen
看起来像这样:
try {
DatabaseSetup async1 = new DatabaseSetup(this);
async1.execute().get;
new Async2.execute();
new Async3.execute();
new Async4.execute();
new Async5.execute();
} finally {
Intent i = new Intent(this, HomePage.class);
StartActivity(i);
}
异步2到5
:
class Async# extends AsyncTask<Void, String, Boolean> {
private Context context;
private Activity activity;
private TextView tv;
private ImageView iv;
public Async#(Context context) {
this.context = context;
this.activity = (Activity) context;
}
onPreExecute() {
super.onPreExecute();
tv = (TextView) activity.findViewById(R.id.tvLoader);
iv = (ImageView) activity.findViewById(R.id.ivLoader);
}
doInBackground() {
publishProgress("Running Async#");
.
.
.
for(int i=0; i < items.length; i++) {
publishProgress(item[i].getImageLink());
}
}
onProgress(String... values) {
if(values[0].contains("Loading")
tvLoader.setText(values[0]);
else()
ivLoader.setImageURL(values[0]);
}
}
非常感谢您阅读所有这些 您可以使用类似于信号量的简单方法。 让您的启动活动实现一个简单的界面:
public interface DecrementCallback{
public void setCount(int cnt);
public void onDecrementCount();
}
将成员定义为计数器:
private int cnt = 0;
您要实现的方法应该类似于:
@Override
public void setCount(int cnt) {
this.cnt = cnt;
}
@Override
public void onDecrementCount() {
cnt--;
if(cnt <= 0){
/**
* Start your main activity
*/
}
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
((DecrementCallback)activity).onDecrementCount();
if(this instanceof Async1){
new Async2(activity).execute();
}else if(this instanceof Async2){
new Async3(activity).execute();
}else if(this instanceof Async3){
new Async4(activity).execute();
}else if(this instanceof Async4){
new Async5(activity).execute();
}
}
public static interface DecrementCallback{
public void setCount(int cnt);
public void onDecrementCount(AsyncTask<Void, Void, Void> task);
}
将此方法添加到异步任务:
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
((DecrementCallback)activity).onDecrementCount();
}
当您在所有异步任务中共享相同的TextView和ImageView时,您应该非常清楚自己在做什么,因为如果更新不正确,可能会混淆用户
编辑:
如果要按顺序运行asynctasks(首先是Async1,然后是Async2,然后是Async3),可以将onPostExecute()方法修改为类似以下内容:
@Override
public void setCount(int cnt) {
this.cnt = cnt;
}
@Override
public void onDecrementCount() {
cnt--;
if(cnt <= 0){
/**
* Start your main activity
*/
}
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
((DecrementCallback)activity).onDecrementCount();
if(this instanceof Async1){
new Async2(activity).execute();
}else if(this instanceof Async2){
new Async3(activity).execute();
}else if(this instanceof Async3){
new Async4(activity).execute();
}else if(this instanceof Async4){
new Async5(activity).execute();
}
}
public static interface DecrementCallback{
public void setCount(int cnt);
public void onDecrementCount(AsyncTask<Void, Void, Void> task);
}
然后,您只需要在活动中启动Async1
编辑2:
如果要从启动活动启动所有异步任务,可以将回调修改为以下内容:
@Override
public void setCount(int cnt) {
this.cnt = cnt;
}
@Override
public void onDecrementCount() {
cnt--;
if(cnt <= 0){
/**
* Start your main activity
*/
}
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
((DecrementCallback)activity).onDecrementCount();
if(this instanceof Async1){
new Async2(activity).execute();
}else if(this instanceof Async2){
new Async3(activity).execute();
}else if(this instanceof Async3){
new Async4(activity).execute();
}else if(this instanceof Async4){
new Async5(activity).execute();
}
}
public static interface DecrementCallback{
public void setCount(int cnt);
public void onDecrementCount(AsyncTask<Void, Void, Void> task);
}
活动中被重写的方法应该如下所示:
@Override
public void onDecrementCount(AsyncTask<Void, Void, Void> task) {
cnt--;
if(cnt <= 0){
/**
* Start your main activity
*/
}
if(task instanceof Async1){
new Async2(activity).execute();
}else if(task instanceof Async2){
new Async3(activity).execute();
}else if(task instanceof Async3){
new Async4(activity).execute();
}else if(task instanceof Async4){
new Async5(activity).execute();
}
}
@覆盖
公共void onDecrementCount(异步任务){
碳纳米管;
如果(cnt)你所说的曲面#2是无效的。!!!如果出现异常,请与你分享logcatIt不会引发异常。我将用LogCat更新问题ThoughtYou intent(home.class)应该在第五个异步任务完成后启动?是的。我想我应该将其添加到Async 5的onPostExecute
?是的,因为您当前的代码将在启动第五个异步任务后立即打开意图,而不必等待它完成。这将允许我启动主页活动。但这将如何允许我运行AsyncTasks按顺序运行?您需要按顺序还是并行运行AsyncTasks?您发布的代码是为了让所有AsyncTasks并行运行。我需要按顺序运行它们(标题中说:P)。请检查答案的编辑以查看按顺序执行的方式。多线程是一个广泛的领域。我鼓励您继续挖掘这一领域。祝您好运。