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)。请检查答案的编辑以查看按顺序执行的方式。多线程是一个广泛的领域。我鼓励您继续挖掘这一领域。祝您好运。