Android线程交互(Handler+Thread 和 AsyncTask)
2010-09-10 00:49:00 来源:WEB开发网e.printStackTrace();
}
return null;
}
}
网络连接通常是比较耗时的,尤其是在当前的GPRS这种低速率的网络情况下,这样connect()方法可能需要3-5秒,
甚至更长的时间才能返回页面的内容。如果此连接动作直接在主线程,也就是UI线程中处理,会发生什么情况呢?
为了在模拟器中更好的模拟网络读取速度慢的情况,
笔者在读取过程中让线程休眠了50秒,
运行NetworkActivity,点击“连接”按钮。意外发生了,
按钮长时间没有反应,整个界面似乎是“死”掉了。系统随后显示出了 ANR(应用程序无响应)
错误提示,如图1所示:
在线程中联网
为什么出现ANR?答案是联网动作阻塞在了主线程,长时间没有返回,这样OPhone弹出ANR错误。这个错误提示我们,
如果否个任务可能需要长时间的运行才能返回,则必须把这个任务放置到单独线程中运行,
避免阻塞UI线程。Java语言内置了对线程的支持,可以使用Thread类创建一个新线程,然后在run()方法中读取网页的内容,
获得页面内容后调用TextView.setText()更新界面。修改后的connect()
方法如下所示:
view plaincopy to clipboardprint?
private void connect() {
new Thread() {
public void run() {
try {
HttpClient client = new DefaultHttpClient();
// params[0]代表连接的url
HttpGet get = new HttpGet(url.getText().toString());
HttpResponse response = client.execute(get);
HttpEntity entity = response.getEntity();
long length = entity.getContentLength();
InputStream is = entity.getContent();
String s = null;
if (is != null) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buf = new byte[128];
int ch = -1;
int count = 0;
while ((ch = is.read(buf)) != -1) {
更多精彩
赞助商链接