WEB开发网
开发学院手机开发Android 开发 Android线程交互(Handler+Thread 和 AsyncTask)... 阅读

Android线程交互(Handler+Thread 和 AsyncTask)

 2010-09-10 00:49:00 来源:WEB开发网   
核心提示:e.printStackTrace();}return null;}}网络连接通常是比较耗时的,尤其是在当前的GPRS这种低速率的网络情况下,Android线程交互(Handler+Thread 和 AsyncTask)(3),这样connect()方法可能需要3-5秒,甚至更长的时间才能返回页面的内容,可以使用Thr

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) {

上一页  1 2 3 4 5 6 7 8  下一页

Tags:Android 线程 交互

编辑录入:coldstar [复制链接] [打 印]
赞助商链接