我的应用有一个小部件。我使用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;
}
答案 0 :(得分:0)
当您使用handler.postDelayed
时,您发布的Runnable
将在UI线程上运行。您需要创建Thread
(或AsyncTask
或ScheduledThreadPoolExecutor
等)以从UI线程中获取网络活动。
如果没有看到您的代码,就很难提供有关如何重组代码的具体建议。关键是Handler
将不从UI线程移出工作。事实上,它通常用于完全相反的方式:作为后台线程在UI线程上运行某些东西的一种方式。