万书网 > 文学作品 > Android从入门到精通 > 第154页

第154页





URL  url;



try  {



url  =  new  URL(target);



HttpURLConnection  urlConn  =  (HttpURLConnection)  url



.openConnection();  //创建一个HTTP连接



urlConn.setRequestMethod("POST");  //指定使用POST请求方式



urlConn.setDoInput(true);  //向连接中写入数据



urlConn.setDoOutput(true);  //从连接中读取数据



urlConn.setUseCaches(false);  //禁止缓存



urlConn.setInstanceFollowRedirects(true);  //自动执行HTTP重定向



urlConn.setRequestProperty("Content-Type",



"application/x-www-form-urlencoded");  //设置内容类型



DataOutputStream  out  =  new  DataOutputStream(



urlConn.getOutputStream());  //获取输出流



String  param  =  "nickname="



+  URLEncoder.encode(nickname.getText().toString(),  "utf-8")



+  "&content="



+  URLEncoder.encode(content.getText().toString(),  "utf-8");  //连接要提交的数据



out.writeBytes(param);  //将要传递的数据写入数据输出流



out.flush();  //输出缓存



out.close();  //关闭数据输出流



//判断是否响应成功



if  (urlConn.getResponseCode()  ==  HttpURLConnection.HTTP_OK)  {



InputStreamReader  in  =  new  InputStreamReader(



urlConn.getInputStream());  //获得读取的内容



BufferedReader  buffer  =  new  BufferedReader(in);  //获取输入流对象



String  inputLine  =  null;



while  ((inputLine  =  buffer.readLine())  !=  null)  {



result  +=  inputLine  +  "\n";



}



in.close();  //关闭字符输入流



}



urlConn.disconnect();  //断开连接



}  catch  (MalformedURLException  e)  {



e.printStackTrace();



}  catch  (IOException  e)  {



e.printStackTrace();



}



}

说明:  在设置要提交的数据时,如果包括多个参数,则各个参数间使用“&”进行连接。

(4)在onCreate()方法中,获取布局管理器中添加的昵称编辑框、内容编辑框、显示结果的文本框和“发表”按钮,并为“发表”按钮添加单击事件监听器,在重写的onClick()方法中,首先判断输入的昵称和内容是否为空,只要有一个为空,就给出消息提示;否则,创建一个新的线程,用于调用send()方法发送并读取服务器处理后的微博信息,具体代码如下:

content  =  (EditText)  findViewById(R.id.content);  //获取输入文本内容的EditText组件



resultTV  =  (TextView)  findViewById(R.id.result);  //获取显示结果的TextView组件



nickname=(EditText)findViewById(R.id.nickname);  //获取输入昵称的EditText组件



button  =  (Button)  findViewById(R.id.button);  //获取“发表”按钮组件



//为按钮添加单击事件监听器



button.setOnClickListener(new  OnClickListener()  {



@Override



public  void  onClick(View  v)  {



if  ("".equals(content.getText().toString()))  {



Toast.makeText(MainActivity.this,  "请输入要发表的内容!",Toast.LENGTH_SHORT).show();



return;



}



//创建一个新线程,用于发送并读取微博信息



new  Thread(new  Runnable()  {



public  void  run()  {



send();



Message  m  =  handler.obtainMessage();  //获取一个Message



handler.sendMessage(m);  //发送消息



}



}).start();  //开启线程



}



});

(5)创建一个Handler对象,在重写的handleMessage()方法中,当变量result不为空时,将其显示到结果文本框中,并清空昵称和内容编辑器,具体代码如下:

handler  =  new  Handler()  {



@Override



public  void  handleMessage(Message  msg)  {



if  (result  !=  null)  {



resultTV.setText(result);  //显示获得的结果



content.setText("");  //清空内容编辑框



nickname.setText("");  //清空昵称编辑框



}



super.handleMessage(msg);



}



};

(6)由于在本实例中需要访问网络资源,所以还需要在AndroidManifest.xml文件中指定允许访问网络资源的权限,具体代码如下:



另外,还需要编写一个Java  Web实例,用于接收Android客户端发送的请求,并做出响应。这里编写一个名称为dealPost.jsp的文件,在该文件中,首先获取参数nickname和content指定的昵称和微博信息,并保存到相应的变量中,然后当昵称和微博内容均不为空时,对其进行转码,并获取系统时间,同时组合微博信息输出到页面上,具体代码如下:

<%@  page  contentType="text/html;  charset=utf-8"  language="java"  %>