【问题标题】:Android: override onPostExecute() if AsyncTask.execute(new Runnable()) is invoked in a methodAndroid:如果在方法中调用 AsyncTask.execute(new Runnable()),则覆盖 onPostExecute()
【发布时间】:2020-01-28 10:04:47
【问题描述】:

我有一个要在后台线程上执行的方法:

public class MainActivity extends AppCompatActivity {
     @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        foo();
    }

    public static void foo(){
        AsyncTask.execute(() -> {
            // perform some object creations
        });
    }

    public static void foo2(){
      // Method that updates UI (lists and views) which requires the main thread.
    }
}

我想在AsynTask 完成时执行foo2,即onPostExecute()。在这种情况下如何覆盖onPostExecute()

【问题讨论】:

  • 使用AsyncTask.execute(Runnable) 你不能覆盖onPostExecute。您应该创建一个新的 AsyncTask 或创建扩展 AsyncTask 的类。

标签: java android android-asynctask


【解决方案1】:

不能直接实现,可以通过扩展Async类来实现。

【讨论】:

    【解决方案2】:

    这可能会有所帮助,您可以通过类而不是方法来实现。请尝试以下 sn-p:

    @Override
       protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
    
          foo asyncTask=new foo();
          asyncTask.execute();
    
       }
    
    private class foo extends AsyncTask<void, void, void> {
          @Override
          protected void onPreExecute() {
             super.onPreExecute();
    
          }
          @Override
          protected void doInBackground(String... strings) {
    
          }
          @Override
          protected void onPostExecute() {
             super.onPostExecute();
             foo2 asyncTask=new foo2();
             asyncTask.execute();
          }
       }
    
    private class foo2 extends AsyncTask<void, void, void> {
          @Override
          protected void onPreExecute() {
             super.onPreExecute();
    
          }
          @Override
          protected void doInBackground(String... strings) {
    
          }
          @Override
          protected void onPostExecute() {
             super.onPostExecute();
    
          }
       }
    

    【讨论】:

      【解决方案3】:

      这对我有用

      public class MyTask extends AsyncTask<String, Void, String>
      {
          @Override
          protected Void doInBackground(String... params) {
              //Do background 
          }
      
          protected void onPostExecute() {
              foo2();
          }
      }
      
      void foo2(){
          //your function
      }
      

      如果您想在 Asynctask 完成后执行某些功能, 您还可以从 onPostExecute 中更新 UI,这更简单 如果它适合你。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-08
        • 1970-01-01
        • 1970-01-01
        • 2021-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-06
        相关资源
        最近更新 更多