Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在一个线程完成执行后,在android中运行一个线程_Android_Multithreading_Android Asynctask - Fatal编程技术网

在一个线程完成执行后,在android中运行一个线程

在一个线程完成执行后,在android中运行一个线程,android,multithreading,android-asynctask,Android,Multithreading,Android Asynctask,我希望在一个线程完成执行后运行一个线程 这里我使用的是进度条,在进度条完成后,do1应该执行方法,但当我运行应用程序时,应用程序强制关闭 这是我的密码 public void onenc(View view) { progressBar = new ProgressDialog(view.getContext()); progressBar.setCancelable(true); progressBar.setMessage

我希望在一个线程完成执行后运行一个线程

这里我使用的是进度条,在进度条完成后,do1应该执行方法,但当我运行应用程序时,应用程序强制关闭

这是我的密码

         public void onenc(View view) {
          progressBar = new ProgressDialog(view.getContext());
        progressBar.setCancelable(true);
        progressBar.setMessage("Ecoding Text ...");
        progressBar.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        progressBar.setProgress(0);
        progressBar.setMax(100);
        progressBar.show();

        //reset progress bar status
        progressBarStatus = 0;

        //reset filesize
        fileSize = 0;


        new Thread(new Runnable() {
          public void run() {
            while (progressBarStatus < 100) {

              // process some tasks
              progressBarStatus = doSomeTasks();

              // your computer is too fast, sleep 1 second
              try {
                Thread.sleep(10);
              } catch (InterruptedException e) {
                e.printStackTrace();
              }

              // Update the progress bar
              progressBarHandler.post(new Runnable() {
                public void run() {
                  progressBar.setProgress(progressBarStatus);
                }
              });
            }

            // ok, file is downloaded,
            if (progressBarStatus >= 100) {

                // sleep 2 seconds, so that you can see the 100%
                try {
                    Thread.sleep(2000);

                } catch (Exception e) {
                    e.printStackTrace();
                }

                // close the progress bar dialog
                progressBar.dismiss();

            }


          }
           }).start();

        Thread tt =new Thread(new Runnable() {
              public void run() {
        do1();

         try {
                Thread.sleep(1100);
              } catch (InterruptedException e) {
                e.printStackTrace();
              }

              }
           });
        tt.start();

      }
我也尝试过AsyncTask,但两者都同时运行

请帮帮我,我是android的新手

提前谢谢

更新:

异步任务后

      class MyFirstTask extends AsyncTask<String, Boolean, Boolean> {
            @Override
            protected Boolean doInBackground(String... params) {
                return null;
                //Do Stuff
            }
           public void progressUpdate(Integer progress) {
               new Thread(new Runnable() {
                      public void run() {
                        while (progressBarStatus < 100) {

                          // process some tasks
                          progressBarStatus = doSomeTasks();

                          // your computer is too fast, sleep 1 second
                          try {
                            Thread.sleep(10);
                          } catch (InterruptedException e) {
                            e.printStackTrace();
                          }

                          // Update the progress bar
                          progressBarHandler.post(new Runnable() {
                            public void run() {
                              progressBar.setProgress(progressBarStatus);
                            }
                          });
                        }

                        // ok, file is downloaded,
                        if (progressBarStatus >= 100) {

                            // sleep 2 seconds, so that you can see the 100%
                            try {
                                Thread.sleep(2000);

                            } catch (Exception e) {
                                e.printStackTrace();
                            }

                            // close the progress bar dialog
                            progressBar.dismiss();

                        }


                      }
                       }).start();
           }
           @Override
           protected void onPostExecute(Boolean result) {
               //Call your next task
               Thread tt =new Thread(new Runnable() {
                  public void run() {
            do1();

             try {
                    Thread.sleep(1100);
                  } catch (InterruptedException e) {
                    e.printStackTrace();
                  }

                  }
               });
            tt.start();
           }
      }
class MyFirstTask extends AsyncTask<String, Boolean, Boolean> {
    @Override
    protected Boolean doInBackground(String... params) {
        //Do Stuff that takes ages (background thread)
        for(int i=0;i<100;i++){   
            doStuff();
            Thread.sleep(1000L); //sleep because I'm just tired
            publishProgress(i);
            Thread.sleep(2000L); //sleep some more
        }
    }
   @Override
   public void progressUpdate(Integer progress) {
       //Update progress bar (ui thread)
       progressBar.setProgress(progress);

   }
   @Override
   protected void onPostExecute(Boolean result) {
       //Call your next task (ui thread)
       new MyNextTask().execute();
   }
现在甚至没有一个线程在执行应用程序强制关闭

在另一次更新之后

            class MyFirstTask extends AsyncTask<String, Boolean, Boolean> {
            @Override
            protected Boolean doInBackground(String... params) {
                  new Thread(new Runnable() {
                      public void run() {
                        while (progressBarStatus < 100) {

                          // process some tasks
                          progressBarStatus = doSomeTasks();

                          // your computer is too fast, sleep 1 second
                          try {
                            Thread.sleep(10);
                          } catch (InterruptedException e) {
                            e.printStackTrace();
                          }

                          // Update the progress bar
                          progressBarHandler.post(new Runnable() {
                            public void run() {
                              progressBar.setProgress(progressBarStatus);
                            }
                          });
                        }

                        // ok, file is downloaded,
                        if (progressBarStatus >= 100) {

                            // sleep 2 seconds, so that you can see the 100%
                            try {
                                Thread.sleep(2000);

                            } catch (Exception e) {
                                e.printStackTrace();
                            }

                            // close the progress bar dialog
                            progressBar.dismiss();

                        }


                      }
                       }).start();

                return null;
                //Do Stuff
            }
           public void progressUpdate(Integer progress) {

           }
           @Override
           protected void onPostExecute(Boolean result) {

               do1();
               //Call your next task
        /*     Thread tt =new Thread(new Runnable() {
                  public void run() {
            do1();

             try {
                    Thread.sleep(1100);
                  } catch (InterruptedException e) {
                    e.printStackTrace();
                  }

                  }
               });
            tt.start();*/
           }
      }
现在,函数do1在进度条完成之前执行

终于解决了…这是答案。 希望它能帮助别人


根本不要使用线程。使用AsyncTask,因为它可以简化工作,并实现onPostExecute方法来调用下一个AsyncTask

      class MyFirstTask extends AsyncTask<String, Boolean, Boolean> {
            @Override
            protected Boolean doInBackground(String... params) {
                return null;
                //Do Stuff
            }
           public void progressUpdate(Integer progress) {
               new Thread(new Runnable() {
                      public void run() {
                        while (progressBarStatus < 100) {

                          // process some tasks
                          progressBarStatus = doSomeTasks();

                          // your computer is too fast, sleep 1 second
                          try {
                            Thread.sleep(10);
                          } catch (InterruptedException e) {
                            e.printStackTrace();
                          }

                          // Update the progress bar
                          progressBarHandler.post(new Runnable() {
                            public void run() {
                              progressBar.setProgress(progressBarStatus);
                            }
                          });
                        }

                        // ok, file is downloaded,
                        if (progressBarStatus >= 100) {

                            // sleep 2 seconds, so that you can see the 100%
                            try {
                                Thread.sleep(2000);

                            } catch (Exception e) {
                                e.printStackTrace();
                            }

                            // close the progress bar dialog
                            progressBar.dismiss();

                        }


                      }
                       }).start();
           }
           @Override
           protected void onPostExecute(Boolean result) {
               //Call your next task
               Thread tt =new Thread(new Runnable() {
                  public void run() {
            do1();

             try {
                    Thread.sleep(1100);
                  } catch (InterruptedException e) {
                    e.printStackTrace();
                  }

                  }
               });
            tt.start();
           }
      }
class MyFirstTask extends AsyncTask<String, Boolean, Boolean> {
    @Override
    protected Boolean doInBackground(String... params) {
        //Do Stuff that takes ages (background thread)
        for(int i=0;i<100;i++){   
            doStuff();
            Thread.sleep(1000L); //sleep because I'm just tired
            publishProgress(i);
            Thread.sleep(2000L); //sleep some more
        }
    }
   @Override
   public void progressUpdate(Integer progress) {
       //Update progress bar (ui thread)
       progressBar.setProgress(progress);

   }
   @Override
   protected void onPostExecute(Boolean result) {
       //Call your next task (ui thread)
       new MyNextTask().execute();
   }

您可以简单地使用join方法

Thread first = new Thread();
Thread secThread =new Thread();
first.start();
first.join();
secThread.start();

但不要在主线程上执行此操作。

当应用程序崩溃时?是在进度条完成之前还是之后?或者在开始之前?在开始之前崩溃。我用过这个,但另一个线程在第一个线程完成之前启动。@AmitKhurana它不应该。如果在第一个任务执行PostExecute之前不执行下一个任务,则它们应该一个接一个地运行。我已经修改了我的答案,使它更清晰。我已经更新了代码,但仍然给出了错误。根本不使用线程。在doInbackground中完成所有“工作”,它将在后台线程上运行。onPostExecute再次在UI线程上运行,因此您可以更新UI etcStill not working(UI etcStill not working)。do1函数在进度条完成之前执行。这并不理想,因为主线程将在threadOne完成之前阻塞,您将得到什么样的异常。