应用程序在互联网操作httpclient或HttpURLConnection期间冻结

时间:2012-11-20 05:11:45

标签: android httpclient httpurlconnection

我的应用有一个小部件。我使用HttpURLConnection下载内容(每15分钟自动下载)。下载内容通常需要10秒钟。

问题是当应用程序正在使用时,它会在此更新操作在后台继续时冻结/挂起。我正在使用来自我的widget类的updateAppWidget方法的handler.postDelayed。即使我使用后台线程,该应用程序暂时冻结。我想也许是httpConn.connect();可能是问题,并使用DefaultHttpClient。冻结效果仍然相同。

有人可以提供一些有关此问题的见解吗?

...谢谢

来自使用此处理程序的widget类...

Handler handler = new Handler();

handler.postDelayed(new Runnable(){

   public void run() {

    //download and update widget UI here.....   

   }

},1000);

private String download1(String urlString) {

InputStream in = null;
byte[] data = null;
URLConnection conn = null;
try
 {
    URL url = new URL(urlString);
    conn = url.openConnection();

    if ((conn instanceof HttpURLConnection))
    {
        HttpURLConnection httpConn = (HttpURLConnection) conn;
        httpConn.setConnectTimeout(30000);
        httpConn.setReadTimeout(30000);
        httpConn.setAllowUserInteraction(false);
        httpConn.setInstanceFollowRedirects(true);
        httpConn.setRequestMethod("GET");
        httpConn.connect();

        if (httpConn.getResponseCode() == HttpURLConnection.HTTP_OK)
        {
            in = httpConn.getInputStream();
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            int c;
            while((c = in.read()) > -1){
                        baos.write(c);
        }
                    data = baos.toByteArray();
                    baos.close();
                    in.close();
                    String str = new String(data);
                    System.out.println(str);
                    httpConn.disconnect();
                    ((HttpURLConnection) conn).disconnect();
                    return str;
        }
        else
            {
                    httpConn.disconnect();
                    ((HttpURLConnection) conn).disconnect();
            return("Error: Invalid data");
    }


    }
}
catch (Exception ex)
{
    Log.e("TAG",ex.getMessage().toString());
    return("Error: No connection");
}
finally
{
    try
    {
        if (conn != null)
        {
            conn = null;
        }
        if (in != null)
        {
            in.close();
            in = null;
        }

    }catch(IOException ex)
    {
        return("Error: "+ex.getMessage());
    }
}
return null;

}

1 个答案:

答案 0 :(得分:0)

当您使用handler.postDelayed时,您发布的Runnable将在UI线程上运行。您需要创建Thread(或AsyncTaskScheduledThreadPoolExecutor等)以从UI线程中获取网络活动。

如果没有看到您的代码,就很难提供有关如何重组代码的具体建议。关键是Handler从UI线程移出工作。事实上,它通常用于完全相反的方式:作为后台线程在UI线程上运行某些东西的一种方式。