[Android]HTTP请求

–根据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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值