【问题标题】:Listener or Notification on "Launch timeout has expired, giving up wake lock"“启动超时已过期,放弃唤醒锁定”的侦听器或通知
【发布时间】:2012-07-20 14:20:52
【问题描述】:

在我的一个测试设备中,我在 LogCat 中收到了这个可怕的警告:

07-20 09:57:02.093: W/ActivityManager(1159): Launch timeout has expired, giving up wake lock!
07-20 09:57:02.218: W/ActivityManager(1159): Activity idle timeout for HistoryRecord{4072b5e8 com.rero.myapp/.MyActivity}

我的初步研究表明,这是一个常见的问题:

  1. “应用程序可能有 exceeded the VM budget 并且内存不足。”
  2. “这个can be ignored。”
  3. Network problem?
  4. Activity 为 taking to long to start(UI 线程处理过多?)
  5. 涉及HTTP 的服务和广播。
  6. 然后继续...

我的问题是:

  1. “启动超时已过期”的含义是什么?系统是做什么的? (例如,一个消息来源声称它会杀死我的应用程序,但实际上我看到我的应用程序在 1-2 分钟的感知冻结后正常进行)
  2. 是否有在我的应用程序中获得通知的方法关于此警告?

【问题讨论】:

  • 我无意中创建了一个无限布局传递循环时发生了这种情况。 Activity 中是否有任何布局或绘制(OnGlobalLayout、OnPreDraw 等)侦听器离开
  • @kcoppock 实际上我没有你提到的那些,但我确实尝试HttpURLConnection.getResponseCode()google.com 并且......它在 6 分 36 秒后超时! Launch 超时发生得更早,因此我希望将其用作处理这种异常情况的助手。
  • 你能发布你是如何尝试连接的吗?我肯定会确保它在单独的线程上(使用 AsyncTask)。
  • @kcoppock HTTP 超时之谜是一个不同的主题,我刚刚发布了a question dedicated to it。我仍然对在我的应用程序中获得通知关于启动超时警告的方法感兴趣。
  • 我赞成你的另一个问题。我不确定为什么会这样,但我确实认为这两者可能以某种方式相关。我不确定除了在日志中看到它之外,还有其他方法可以获取有关已记录警告的通知。

标签: android android-activity


【解决方案1】:

这是我将尝试的一般想法,但您如何处理 AsyncTask 取决于您在获得状态后正在做什么。我会这样做:

private class GetHttpStatus extends AsyncTask<String, Void, Boolean> {
    @Override
    protected Boolean doInBackground(String[] params) {
        private boolean status;

        //this will be the string you pass in execute()
        String urlString = params[0];

        HttpURLConnection httpConnection;
        try {
            URL gurl = new URL(urlString);
            URLConnection connection = gurl.openConnection();
            connection.setConnectTimeout(5 * 1000);
            httpConnection = (HttpURLConnection) connection;
            int responseCode = httpConnection.getResponseCode();
            if(responseCode == HttpURLConnection.HTTP_OK) {
                status = true;
            }
        } catch (Exception e) {
            status = false;
        } finally { 
            if(httpConnection != null) httpConnection.disconnect();
        }
        return status;
    }

    @Override
    protected Void onPostExecute(Boolean result) {
        //Here you'll do whatever you need to do once the connection
        //status has been established
        MyActivity.notifyHttpStatus(result);
    }
}

//in your Activity somewhere, you would call...

new GetHttpStatus.execute("http://www.amazon.com");

【讨论】:

  • 谢谢+1。如果没有人提出启动警告的通知或侦听器,我也会接受。
猜你喜欢
  • 1970-01-01
  • 2011-11-21
  • 1970-01-01
  • 2012-04-19
  • 1970-01-01
  • 1970-01-01
  • 2015-03-29
  • 2013-07-12
相关资源
最近更新 更多