继续积累吧。
网络连接
- 在Android的应用中,需要进行网络连接的时候,需要首先设置网络的权限。
// AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET"/>
- 进行网络访问,需要创建一个
URL
对象,并使用Http
协议将其发送出去。构建一个URL
对象可以借助Android
的Uri
对象。
- 将
base URL
传入到URI
对象中 - 之后使用
appendQueryParameter
添加query的选项 - 使用
build
方法,得到最终的URI
对象 - 将
URI
对象传入URL
对象中,得到最终的URL
对象
- 将
Uri uri = Uri.parse(FORECAST_BASE_URL).buildUpon()
.appendQueryParameter(QUERY_PARAM, locationQuery)
.appendQueryParameter(FORMAT_PARAM, format)
.appendQueryParameter(UNITS_PARAM, units)
.appendQueryParameter(DAYS_PARAM, Integer.toString(numDays))
.build();
URL url = null;
try {
url = new URL(uri.toString());
} catch (MalformedURLException e) {
e.printStackTrace();
}
- 进行网络访问的操作,必须要在子线程中进行,因为Android的主线程只负责页面的更新,相应用户的操作,需要在17ms内完成一个更新操作,如果一个操作时间过长,例如,网络操作,就会被认为是应用没有响应,会被Android强制关闭。
这里就需要一个新的类AsyncTask。
AsyncTask只有doInBackground
和publicProgress
方法是在新线程中执行,其他的方法还是在主线程中调用。
Menu
- 添加menu,在res文件夹下,添加一个menu文件夹,并添加menu的资源文件。所有的menu资源使用Java进行访问的时候,通过R.menu.xxx进行访问。
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto">
<item
app:showAsAction="ifRoom"
android:id="@+id/action_refresh"
android:title="@string/refresh"/>
</menu>
- 添加menu资源以后,就需要将其放入到activity之中。需要重写onCreateOptionsMenu方法,这个方法返回一个
bool
值,用来控制menu是否展示在界面上。使用getMenuInflater().inflate(menu's id, menu)
将menu
资源放到activity中。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// the resourse of menu is in R.menu
getMenuInflater().inflate(R.menu.forecast, menu);
return true;
}
- 之后需要将
menu
的选择事件。通过传入的Item
的id
来确定当前的处理事件。
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getItemId() == R.id.action_refresh){
mWeatherTextView.setText("");
loadWeatherData();
}
return super.onOptionsItemSelected(item);
}