【问题标题】:AsyncTask is deprecated? What method used instead of onPreExecute and onPostExecute?AsyncTask 已弃用?使用什么方法代替 onPreExecute 和 onPostExecute?
【发布时间】:2021-02-23 09:35:26
【问题描述】:

在我的旧项目中,我使用了 AsyncTask,但它已被弃用,所以我用什么方法代替了这个? 如果我们使用线程,在 AsyncTask 中具有 onbackground、onPreExecute 和 onPostExecute 覆盖方法,这些部分在线程中调用。有没有替代方法。能给我解决办法吗?

Java 代码:

      public class getDetailsfromWeb extends AsyncTask<Void, Void, String> {

      @Override
      protected String doInBackground(Void... params) {

        if (paymentSync == null)

            paymentSync = new ReceivePaymentSync(getActivity());

        allCreditCardModel = new AllCreditCardModel();

        allCreditCardModel = paymentSync.getGetCreditCardById(CrediCardId);

        handler.post(allCreditRunnable);

        return null;
    }

    /**
     * @param string
     */
    public void execute(String string) {

        // TODO Auto-generated method stub
    }

    protected void onPreExecute() {

        showProgress();

    }

    @Override
    protected void onPostExecute(String result) {

        progress.dismiss();

    }
}

【问题讨论】:

  • 我前几天回答过类似的问题stackoverflow.com/a/64619184/14507326
  • @zjmo 在“长时间运行的操作”中我们粘贴 doInBackground 代码和“在主线程上更新 ui”粘贴 onPreExecute 对吗?
  • 那么我们在哪里粘贴 onPostExecute 代码?
  • 视情况而定,可能在您的情况下,预执行在主线程上进行,然后如答案所示打开 rmthread,在后台执行繁重的代码,然后将代码从内部发布到主线程后台线程。实际上,您可以根据需要在主线程上发布任意次数。
  • 在 kotlin 中使用 RXJava 或协程。

标签: android android-studio android-asynctask asynctaskloader


【解决方案1】:

只需使用线程。

onPreExecute 代码进入构造函数。

doInBackground 代码进入 run()。

onPostExecute 代码在 run() 结束时调用的 runOnUiThread 的 runnable 的运行中运行。

【讨论】:

  • 感谢您的回复。无法理解。你可以发布任何示例代码或修改我上面的代码吗?它对我们有帮助@blackapps
  • 如果你用谷歌搜索一个 Thread 示例,然后再搜索 runOnUiThread,你会找到所有你需要的。里面没有多少。然后发布您尝试过的代码,如果它不起作用,我们将讨论它。今天或明天;-)
  • 所以如果我在执行后执行一些 ui 工作,构造函数中的代码不会崩溃?我不能在构造函数中使用 runOnUiThread,因为我还必须在 run() 中调用它
  • 是的。无需在线程的构造函数中使用 runOnUiThread()。
  • 只是伤心。他们应该提供一个简单的替代方案。异步任务相当方便。它甚至有状态和取消
【解决方案2】:

这是一个简单的例子,无论如何我也会看看 WorkManager 库:

Executors.newSingleThreadExecutor().execute(() -> {

    Handler mainHandler = new Handler(Looper.getMainLooper());

      //sync calculations

    mainHandler.post(() -> {
      //Update UI
    });

    //other sync calcs.

    mainHandler.post(() -> {
      //Update UI
    });

  });   

【讨论】:

猜你喜欢
  • 2021-12-13
  • 1970-01-01
  • 2022-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多