【问题标题】:Asynctask is not getting timeout after a thread setup to cancel it after a certain period of timeAsynctask 在线程设置后没有超时以在一段时间后取消它
【发布时间】:2014-03-26 04:04:13
【问题描述】:

如果超过一定时间(如果 AsyncTask 没有自动完成),我正在尝试取消日志运行 AsyncTask

下面是我设置任务以超时开始的代码

final ProfileDesc pdsc = new ProfileDesc();
    pdsc.execute();
    Thread th_pdsc = new Thread(){
        public void run()
        {
            try{
                pdsc.get(120000, TimeUnit.MILLISECONDS);
            }
            catch(Exception e){
                pdsc.cancel(true);
                ((Activity)context).runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                    Toast.makeText(context, "Download Time out. Please Try again later.", Toast.LENGTH_LONG).show();

                    }
                });
            }
        }
    };
    th_pdsc.start();

下面是我的 AsynTask 的代码

private class ProfileDesc extends AsyncTask<Void, Void, Void> {
protected void onPreExecute() {
        dialogue = new ProgressDialog(MainActivity.this);
        dialogue.setTitle("Processing");
        dialogue.setMessage("Getting Header Information");
        dialogue.setIndeterminate(true);
        dialogue.setCancelable(false);
        dialogue.show();
    }
protected void onPostExecute(Void params) {
        super.onPostExecute(params);
            dialogue.dismiss();
}
protected Void doInBackground(Void... arg0) {
//long run work
return null;
}
}

两分钟后它仍在运行。如何设置超时?注意:我已关注 Stack Overflow 的 this link 获取此代码。

【问题讨论】:

    标签: android multithreading android-asynctask


    【解决方案1】:

    你有什么

     ProfileDesc pdsc = new ProfileDesc();
     pdsc.execute();
    

    够了。不需要线程。 doInBackground 在后台线程上调用。这样您就可以在doInbackgorund 中进行网络操作。

    第二次调用 get 使得 AsyncTask 不再是异步的,因为它阻塞了 ui 线程

    get(long timeout, TimeUnit unit) 必要时最多等待 给定计算完成的时间,然后检索其 结果

    我猜你误解了 Asynctask 的使用。阅读文档

    http://developer.android.com/reference/android/os/AsyncTask.html

    你可能想检查一下

    Stop AsyncTask doInBackground method

    【讨论】:

    • 我只想确保 AsyncTask 在特定时间段后超时,如果它没有自动调用 postexecute,因为我的 doinbackground 中有日志运行作业。线程是为了让 AsyncTask 超时而不是为了工作……我做错了吗?如果 AsyncTask 从来没有完成它的 doinbackground 并且用户在整个过程中看到一个 processdialogue。
    • @Saty 说你正在进行网络操作。如果 doInbackground 完成其执行,则控制转到 onPostExecute。如果没有,则会引发崩溃并引发异常。异步任务超时!。阅读文档。 doInbackground 在后台线程上调用。那么为什么是另一个线程。没有意义。
    • @Saty And AsyncTask 用于通常运行几秒钟的操作。如果它用于长时间运行的操作,请使用 Intent Service/Quoting 文档
    • 好的,所以没有办法为 AsyncTask 设置超时?能否请您告诉我或举一些 Intent Service 进行网络操作的示例,并向用户显示一些进度指示器。
    • @Saty a different question post a different question
    【解决方案2】:

    这里不需要新线程。只需删除“dialogue.setIndeterminate(true)”。这意味着没有测量“加载量”。我认为这是造成问题的原因。

    【讨论】:

    • 好的...那么 AsyncTask 怎么知道什么时候完成...如果 asynctask 没有得到任何东西或者在两者之间的互联网连接断开了?
    • @Saty 在这种情况下,它会给你一个可以适当处理的异常。您需要重新阅读文档
    • 所以你的意思是说我将在 try 块中包围 doinBackground 的所有代码并检查异常,如果在读取输入流时发生任何异常(如 IOException)并适当地提醒用户?但是我刚刚检查了我所做的示例,它似乎工作并在 2 分钟后超时 AsyncTask
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 2019-04-28
    • 2017-03-13
    • 1970-01-01
    相关资源
    最近更新 更多