–根据Udacity中ud851课程整理笔记
创建请求URL
在创建NetworkUtils类, 并添加builUrl方法, 其中Uri使用的为android.net.Uri.
public static URL buildUrl(String githubSearchQuery) {
// DONE (1) Fill in this method to build the proper Github query URL
// import android.net.Uri;
Uri uriBuild = Uri.parse(GITHUB_BASE_URL).buildUpon()
.appendQueryParameter(PARAM_QUERY, githubSearchQuery).
appendQueryParameter(PARAM_SORT, sortBy).build();
URL urlbuilt = null;
try {
urlbuilt = new URL(uriBuild.toString());
} catch (MalformedURLException e) {
e.printStackTrace();
}
return urlbuilt;
}
并在MainActivity.java的响应事件调用的处理函数中使用此方法.
发送网络请求
/**
* This method returns the entire result from the HTTP response.
*
* @param url The URL to fetch the HTTP response from.
* @return The contents of the HTTP response.
* @throws IOException Related to network and stream reading
*/
public static String getResponseFromHttpUrl(URL url) throws IOException {
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
try {
InputStream in = urlConnection.getInputStream();
Scanner scanner = new Scanner(in);
scanner.useDelimiter("\\A");
boolean hasInput = scanner.hasNext();
if (hasInput) {
return scanner.next();
} else {
return null;
}
} finally {
urlConnection.disconnect();
}
}
添加网络访问许可
在AndroidManifest中添加permission, 允许app访问网络
<!--DONE (1) Add the INTERNET permission-->
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
此时在MainActivity.java中调用getResponseFromHttpUrl(), 程序会终止运行, 并提示Exception: android.os.NetworkOnMainThreadException. 这是因为在UIThread中访问网络会占用数秒的时间, Android Os 发现UIThread在一段时间内都没有响应, 以为应用终止了. 所以对网络的访问不能放在主线程中, 应该放到后台去. 对此, 安卓提供了一个类AsyncTask, 用于这些数秒级的任务 (至于更长时间的任务就需要使用java.util.concurrent 中的Executor, ThreadPoolExecutor, FutureTask等了).
AsyncTask
在继承的AsyncTask类中, doInBackground()是在后台执行的函数, 在这个函数中不能直接操作UI里的View进行更新。在doInBackground()执行完之后的结果将作为参数直接传入onPostExecute().
// AsyncTask<URL, Void, String>中, 第一个参数为后台任务传入参数, 第二个参数是处理进度, 这里是Void, 因为不需要向主进程更新处理进度, 最后一个为返回的参数类型.
class GithubQueryTask extends AsyncTask<URL,Void,String>{
@Override
protected String doInBackground(URL... params) {
URL url = params[0];
String result = null;
try {
result = NetworkUtils.getResponseFromHttpUrl(url);
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
@Override
protected void onPostExecute(String s) {
mSearchResultsTextView.setText(s);
}
}
在主线程中使用execute(), 运行此网络任务.
GithubQueryTask task = new GithubQueryTask();
task.execute(githubSearchUrl);