您的位置:首页 > 理论基础 > 计算机网络

android App中的网络访问

2012-12-25 11:17 323 查看
单机app在android的生态环境中几乎没有立足之地,因此app获取网络访问权的能力是必不可少的,本文除了代码之外还包括一些注意事项(可能是太基础了所以书上或者其他参考网站都没有提及这些细节)。

一,在AndroidManifest.xml中加入访问互联网的权限:
< uses-permission android:name = "android.permission.INTERNET" />

二,访问互联网的操作不能在main thread (对于activity来说是UI thread)中进行,否则会报错:
”android.os.NetworkOnMainThreadException“

可选的方式有:
1, 使用AsyncTask处理网络操作。
2, 在activity中创建新thread处理网络操作。
3, 启动service并在service中创建新thread处理网络操作。

三,下面以简单的GET方式作为例子说明。
1, 访问互联网的主函数:
public String executeHttpGet(){
		 BufferedReader in = null;
		 String result = "empty";
		 String weather = "http://m.weather.com.cn/data/101280601.html";
		 
		 try{
			 DefaultHttpClient client = new DefaultHttpClient();
			 HttpGet request = new HttpGet();
			 request.setURI(new URI(weather)); // url max length = 2048, need to do POST if u wanna long request
			 HttpResponse response = client.execute(request);
			 in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
			 
			 StringBuffer sb = new StringBuffer();
			 String line = "";
			 String NL = System.getProperty("line.separator");
			 
			 while((line=in.readLine()) != null){
				 sb.append(line + NL);
			 }
			 
			 result = sb.toString();
			 // Log.d(DEBUG_TAG, result);
		 }catch(Exception e){
			 e.printStackTrace();
		 }finally{
			 if(in != null){
				 try{
					 in.close();
				 }catch(Exception e){
					 e.printStackTrace();
				 }
			 }
		 }
		 
		 return result;
	 }


2, 在AsyncTask的doInBackground里面调用这个函数:
class HttpTask extends AsyncTask<Integer, Integer, String>{

		 @Override
		 protected String doInBackground(Integer... params) {
		 	return executeHttpGet();
		 }
		 
		 @Override
		 protected void onPostExecute(String result){ // update UI when process done
			 Log.e(DEBUG_TAG, "onPostExecute");
			 if(mTextView != null)
			 	mTextView.setText(result);
			 super.onPostExecute(result); 
		 }
		 
	}


3, 在UI线程中启动task:
public void onCreate(Bundle savedInstanceState){
	     super.onCreate(savedInstanceState);
	     setContentView(R.layout.http1);
	        ... ... // other initialization
	     new HttpTask().execute();
	    } // end of onCreate


* AsyncTask的使用还需要优化,这里仅作为demo简单实现。上述代码在N880E上验证通过。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: