执行网络操作(一):连接到网络

- 执行网络操作需要的权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

选择HTTP客户端
HttpURLConnection:2.3+推荐使用
- Apache HttpClient:太大
- 都支持HTTPS,流上传和下载,配置超时,IPv6,连接池
- 参看:   Android's HTTP Clients

检查网络连接
- 设备可能在网络覆盖范围之外
- Wifi和移动网络连接可能都被关闭
- 关键接口:
getActiveNetworkInfo ()
isConnected ()
public void myClickHandler(View view) {
   
...
   
ConnectivityManager connMgr = (ConnectivityManager)
        getSystemService
(Context.CONNECTIVITY_SERVICE);
   
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
   
if (networkInfo != null && networkInfo.isConnected()) {
       
// fetch data
   
} else {
       
// display error
   
}
   
...
}
- ConnectivityManager:用来查询网络连接状态的组件。当网络连接变动时,它也通知应用程序。主要职责:
  * 监视网络连接(Wi-Fi, GPRS, UMTS等)
  * 网络连接变化时发送广播意图
  * 当连接丢失时尝试转向另一个连接
  * 提供API以允许应用程序插叙可用网络的粗粒度或细粒度状态

单开一个线程执行网络操作
public class HttpExampleActivity extends Activity {
   
private static final String DEBUG_TAG = "HttpExample";
   
private EditText urlText;
   
private TextView textView;
   
   
@Override
   
public void onCreate(Bundle savedInstanceState) {
       
super.onCreate(savedInstanceState);
        setContentView
(R.layout.main);  
        urlText
= (EditText) findViewById(R.id.myUrl);
        textView
= (TextView) findViewById(R.id.myText);
   
}

   
// When user clicks button, calls AsyncTask.
   
// Before attempting to fetch the URL, makes sure that there is a network connection.
   
public void myClickHandler(View view) {
       
// Gets the URL from the UI's text field.
       
String stringUrl = urlText.getText().toString();
       
ConnectivityManager connMgr = (ConnectivityManager)
            getSystemService
(Context.CONNECTIVITY_SERVICE);
       
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
       
if (networkInfo != null && networkInfo.isConnected()) {
           
new DownloadWebpageText().execute(stringUrl);
       
} else {
            textView
.setText("No network connection available.");
       
}
   
}

     
// Uses AsyncTask to create a task away from the main UI thread. This task takes a
     
// URL string and uses it to create an HttpUrlConnection. Once the connection
     
// has been established, the AsyncTask downloads the contents of the webpage as
     
// an InputStream. Finally, the InputStream is converted into a string, which is
     
// displayed in the UI by the AsyncTask's onPostExecute method.
     
private class DownloadWebpageText extends AsyncTask {
       
@Override
       
protected String doInBackground(String... urls) {
             
           
// params comes from the execute() call: params[0] is the url.
           
try {
               
return downloadUrl(urls[0]);
           
} catch (IOException e) {
               
return "Unable to retrieve web page. URL may be invalid.";
           
}
       
}
       
// onPostExecute displays the results of the AsyncTask.
       
@Override
       
protected void onPostExecute(String result) {
            textView
.setText(result);
       
}
   
}
   
...
}

连接并下载数据
- 用HttpURLConnection执行GET操作以下载数据
- 调用connect()方法之后,通过getInputStream()可以获得一个输入流
// Given a URL, establishes an HttpUrlConnection and retrieves
// the web page content as a InputStream, which it returns as
// a string.
private String downloadUrl(String myurl) throws IOException {
   
InputStream is = null;
   
// Only display the first 500 characters of the retrieved
   
// web page content.
   
int len = 500;
       
   
try {
        URL url
= new URL(myurl);
       
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn
.setReadTimeout(10000 );
        conn
.setConnectTimeout(15000 );
        conn
.setRequestMethod("GET");
        conn
.setDoInput(true);
       
// Starts the query
        conn
.connect();
       
int response = conn.getResponseCode();
       
Log.d(DEBUG_TAG, "The response is: " + response);
       
is = conn.getInputStream();

       
// Convert the InputStream into a string
       
String contentAsString = readIt(is, len);
       
return contentAsString;
       
   
// Makes sure that the InputStream is closed after the app is
   
// finished using it.
   
} finally {
       
if (is != null) {
           
is.close();
       
}
   
}
}

- 注意,调用 getResponseCode()返回可以返回连接的状态码   status code,以此获取连接附加信息
- 200表示成功

将输入流转化为字符串
- 输入流由字节构成
- 拿到输入流之后,通常进行解码,或转化为目标数据类型
- 位图例子:
InputStream is = null;
...
Bitmap bitmap = BitmapFactory.decodeStream(is);
ImageView imageView = (ImageView) findViewById(R.id.image_view);
imageView
.setImageBitmap(bitmap);

- 转换一个网页文本:
// Reads an InputStream and converts it to a String.
public String readIt(InputStream stream, int len) throws IOException, UnsupportedEncodingException {
   
Reader reader = null;
    reader
= new InputStreamReader(stream, "UTF-8");        
   
char[] buffer = new char[len];
    reader
.read(buffer);
   
return new String(buffer);
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值