单机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上验证通过。