技术开发 频道

OPhone联网应用开发中的线程管理与界面更新

  在线程中联网

  为什么出现ANR?答案是联网动作阻塞在了主线程,长时间没有返回,这样OPhone弹出ANR错误。这个错误提示我们,如果否个任务可能需要长时间的运行才能返回,则必须把这个任务放置到单独线程中运行,避免阻塞UI线程。Java语言内置了对线程的支持,可以使用Thread类创建一个新线程,然后在run()方法中读取网页的内容,获得页面内容后调用TextView.setText()更新界面。修改后的connect() 方法如下所示:

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) {
                            baos.write(buf,
0, ch);
                            count
+= ch;
                        }
                        s
= new String(baos.toByteArray());
                        message.setText(s);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }

   重新运行NetworkActivity,点击“连接”按钮。程序并没有像预期的那种获得网页的内容,并显示到TextView上。查看log可以看到在connect的执行过程中抛出了异常。接下来分析问题的所在。

0
相关文章