异步任务时间限制

时间:2018-07-30 07:43:32

标签: java android

这是我的代码:

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 MILLISECONDS并且未完成工作,则返回消息,我该如何编码?谢谢

2 个答案:

答案 0 :(得分:0)

我更喜欢使用AsyncTask来做到这一点。

从链接复制粘贴:

  

AsyncTask允许正确且轻松地使用UI线程。这个班   允许您执行后台操作并在   UI线程,而无需操纵线程和/或处理程序。

     

AsyncTask被设计为围绕Thread和Handler的帮助器类   并且不构成通用线程框架。异步任务   理想情况下应用于短时间操作(在   大多数。)如果您需要使线程长时间运行,   强烈建议您使用由   java.util.concurrent包,例如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);

这将为您的异步操作设置超时。 Look here获取确切的异常/返回

如有其他疑问,请随意提问。希望这会有所帮助

编辑:

我刚刚注意到您的线程中有一个AsyncTask。由于AsyncTask 已经异步,因此我避免这样做,而只需使用我之前给您的方法调用AsyncTask。这样,AsyncTask将运行到给定的TimeSpan:)

答案 1 :(得分:-1)

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

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;
    }