为了账号安全,请及时绑定邮箱和手机立即绑定

java - 如果异步任务时间限制

java - 如果异步任务时间限制

慕桂英3389331 2021-06-15 17:01:24
这是我的一段代码:Thread  one = new Thread() {    public void run() {        try {            new LongOperation(finalJson)                .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)                .get(30000, TimeUnit.MILLISECONDS);        } catch (InterruptedException e) {            e.printStackTrace();        } catch (ExecutionException e) {            e.printStackTrace();        } catch (TimeoutException e) {            e.printStackTrace();        }    }};one.start();我想说如果AsyncTask超过 30000 毫秒并且没有完成工作返回一条消息,我该如何编码?谢谢
查看完整描述

2 回答

?
开心每一天1111

TA贡献1836条经验 获得超13个赞

我更喜欢使用AsyncTask来做。


从链接复制粘贴:


AsyncTask 可以正确且轻松地使用 UI 线程。此类允许您在 UI 线程上执行后台操作并发布结果,而无需操作线程和/或处理程序。


AsyncTask 被设计为围绕 Thread 和 Handler 的辅助类,并不构成通用的线程框架。理想情况下,AsyncTasks 应该用于短期操作(最多几秒钟)。如果您需要让线程长时间运行,强烈建议您使用 java.util.concurrent 包提供的各种 API,例如Executor、ThreadPoolExecutor 和 FutureTask。


说了这么多,配置一个 AsyncTask 还是蛮简单的,只需要创建一个像下面这样的类:


private class LongOperation extends AsyncTask<String, Void, String> {



    @Override

    protected void onPreExecute() {

        super.onPreExecute();

        //this method works on the UI thread.

        //this is the first to run before "doInBackground"

        mTextView.setText("we start!");

    }


    @Override

    protected String doInBackground(String... params) {

       try {

          //do whatever your async task needs to do. This method works async

          //you can also call an UI callback from here with the publishProgress method. This will call the "onProgressUpdate" method, and it has to respect his type.

          publishProgress("we go on!");

       } catch (InterruptedException e) {

         Thread.interrupted();

       }

       return "Executed";

    }


    @Override

    protected void onPostExecute(String result) {

      //this method works on the UI thread

      //it get the "doInBackground" return value.

      mTextView.setText(result);

    }


    @Override

    protected void onPreExecute() {}


    @Override

    protected void onProgressUpdate(String... values) {

       //this method works on UI thread, so it can access UI components and ctx

       mTextView.setText(values[0]);

    }

}

这是一个关于如何创建 AsyncTask 的基本示例,您可以像这样使用它(表单活动/片段):


AsyncTaskExample asyncTask = new AsyncTaskExample();

asyncTask.get(30000, TimeUnit.MILLISECONDS);

这将为您的异步操作设置超时。在这里查看确切的异常/返回


如有任何进一步的问题,请自由提问。希望这可以帮助


编辑:

我只是注意到你AsyncTask的线程里面有一个。由于AsyncTask 已经是 async,我会避免这样做,只需AsyncTask使用我之前给您的方法调用。这样,AsyncTask将运行到给定的 TimeSpan :)


查看完整回答
反对 回复 2021-06-17
?
HUH函数

TA贡献1836条经验 获得超4个赞

请参阅下面的代码:它可能对您有所帮助。


CountDownTimer timer = new CountDownTimer(3000,1000) {

    @Override

    public void onTick(long l) {


    }


    @Override

    public void onFinish() {

        //return a message here;

    }

};

timer.start();

如果你有一个异步任务。然后在doInBackground方法中执行以下操作:


 @Override

    protected Void doInBackground(Void... voids) {

       //simply do your job

        CountDownTimer timer = new CountDownTimer(3000,1000) {

            @Override

            public void onTick(long l) {


            }


            @Override

            public void onFinish() {

                //return a message here;

                return message;

            }

        };

        timer.start();

        return your_reult;

    }


查看完整回答
反对 回复 2021-06-17
  • 2 回答
  • 0 关注
  • 372 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信