【问题标题】:How to start a new Activity after completing 2 AsyncTask From an Activity?完成 2 AsyncTask From Activity 后如何启动新的 Activity?
【发布时间】:2015-07-01 11:02:02
【问题描述】:

在我的主Activity 中有两个不同的AsyncTask 在后台运行。

在 AsyncTask 之后它开始新的Activity

这个工作正常

主要活动---->>>>新活动

问题:

但我的问题是没有完成两个AsyncTasks,它移动到新的Activity

两个任务都必须完成,然后才去新建Activity

帮我解决这个问题。

AsyncCallWSfor1 task1 = new AsyncCallWSfor1();
                // Call execute
                task1.execute();


                AsyncCallWSfor2 task2 = new AsyncCallWSfor2();
                // Call execute
                task2.execute();

        Toast.makeText(sign_in.this, "Login Successfull",Toast.LENGTH_LONG).show();
        Intent intent = new Intent(MainActivivty.this,NewActvity.class);
            startActivity(intent);
            finish();

【问题讨论】:

  • 在 asyctask 的后期执行中编写代码以启动新活动
  • post Execute ok,两个异步任务都有 Postexecute 我必须添加
  • 您首先需要了解 AsyncTask 的作用。并制定一个算法来等待这两个任务完成。
  • 为两个 asynctask 维护两个布尔值。将它们分配为真 onPostMethod 并检查两个布尔值是否为真然后导航。
  • 我猜是第二个任务。因为任务的执行是串行的。

标签: android android-activity android-asynctask


【解决方案1】:

这样做肯定会解决你的问题

  //create variable for your activity or fragment
            Boolean isTask1Completed=false,isTask2Completed=false;

            //on post execute of task 1
            isTask1Completed = true;
            if(isTask1Completed&&isTask2Completed){
                //start activity here
            }

            //on post execute of task 2
            isTask2Completed = true;

            if(isTask1Completed&&isTask2Completed){
                //start activity here
            }

【讨论】:

  • 这是你要找的,除了同步问题。
  • 这是两个任务都开始的时候,我们必须找出两者都完成了,如果是,那么继续
  • 再考虑一下,因为onPostExecute 在 ui 中被调用,同步不会成为问题。
  • 我没听懂你到底想说什么。顺便说一下,根据用户想要先完成这两个任务的问题。
  • 如果我这样做,用户界面有什么问题吗? @bluebrain
【解决方案2】:

使用一些简单的检查器

boolean first = false;
boolean second = false;

AsyncTask1
onPostExecute() { 
  first = true;
  if (first && second) startActivity();
} 

AsyncTask2
onPostExecute() { 
  second = true; 
  if (first && second) startActivity();
}

【讨论】:

  • 再想一想,volatile 不是必需的。
【解决方案3】:

为什么你不能使用一个异步任务尝试两种方法

        private class MyTask extends AsyncTask<String, String, String> {

                        @Override
                        protected void onPreExecute() {
                            super.onPreExecute();

                        }


                        @Override
                        protected String doInBackground(String... url) {
                          String result="";
                         if(url.equals("m1"))
                            {

                                <!--Method one-->
                                 result="first";
                            }else
                            {

                                 <!--Method Two-->
                                  result="second";

                            }

                                return result;
                        }

                        @Override
                        protected void onPostExecute(String result) {
                              if(result.equals("second")
                               {
                                <!--Start activity-->
                               }else
                               {
                                 <!--Call Asynchronous task with second method-->
                              }
                    }
                }

【讨论】:

  • 因为它从Web服务中获取数据有两种不同的方法
【解决方案4】:

您需要添加以下代码

Toast.makeText(sign_in.this, "登录成功",Toast.LENGTH_LONG).show(); Intent 意图 = new Intent(MainActivivty.this,NewActvity.class); 开始活动(意图); 完成()

在你的..

AsyncCallWSfor2 task2 = new AsyncCallWSfor2();

post 方法会运行良好....

【讨论】:

    【解决方案5】:

    我建议使用回调。 您启动您的(我认为)API 客户端或其他东西并运行查询。 当它启动时,它将在一个新的线程中运行请求,一旦它完成加载,它会回调已启动请求的活动。

    这样你就可以确定,任务会一个接一个地完成。

    Activity -> new ApiClient() -> execute(url, parameters) -> new Thread() -> 运行查询 -> 调用 ApiClientCallback -> Activity 接收响应 -> 做任何必要的事情

    看看这里:http://www.techotopia.com/index.php/A_Basic_Overview_of_Android_Threads_and_Thread_handlers

    【讨论】:

      【解决方案6】:

      异步任务串行执行。你应该把它放在第二个任务的 postExecute 上。

      首次引入时,AsyncTask 是在单个后台线程上串行执行的。从 DONUT 开始,这被更改为允许多个任务并行运行的线程池。从 HONEYCOMB 开始,任务在单线程上执行,以避免并行执行导致的常见应用程序错误。

      如果你真的想要并行执行,你可以使用 THREAD_POOL_EXECUTOR 调用 executeOnExecutor(java.util.concurrent.Executor, Object[])。

      【讨论】:

      • 这似乎是对我的评论。两个任务可以串行启动,并行执行。
      • 你确定这是文档所说的。 >首次引入时,AsyncTask 在单个后台线程上串行执行。从 DONUT 开始,这被更改为允许多个任务并行运行的线程池。从 HONEYCOMB 开始,任务在单个线程上执行,以避免并行执行导致的常见应用程序错误。如果你真的想要并行执行,你可以使用 THREAD_POOL_EXECUTOR 调用 executeOnExecutor(java.util.concurrent.Executor, Object[])。
      【解决方案7】:

      取一个布尔变量

      boolean firstCompleted=false;
      

      AsyncCallWSfor1onPostExecute(-) 中将其设为true

      firstCompleted=true;
      

      并在onPostExecute(-)AsyncCallWSfor2 中启动新的Activity

      if(firstCompleted){
         Toast.makeText(sign_in.this, "Login Successfull",Toast.LENGTH_LONG).show();
         Intent intent = new Intent(MainActivivty.this,NewActvity.class);
         startActivity(intent);
      }
      

      希望对你有帮助。

      【讨论】:

      • 这使得任务连续,他可以将两个任务合二为一。
      • 但是这里第一个任务失败了 2 任务不会执行?
      • 如果2个任务完成了,就会去新的Activity知道,连第一个任务都没有完成!!!
      猜你喜欢
      • 1970-01-01
      • 2017-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多