发表于: 2018-10-24 23:12:40

0 790


一、今天完成的事情

HttpURLConnection

     首先要记得声明网络权限。

<!--网络权限-->
<uses-permission android:name="android.permission.INTERNET"/>

      权限要是输错了,AS是不会报错的,也不会有任何提示,可以正常安装到手机上,然后运行出错,然后找bug找半天,别问我是正面知道的......

     创建一个HttpURLConnection对象,传入一个url

private void sendRequestWithHttpURLConnection() {
    new Thread(new Runnable() {
           @Override
           public void run() {
           //创建HttpURLConnection对象
           HttpURLConnection connection = null;
           BufferedReader reader = null;
           try {
               URL url = new URL("https://www.baidu.com");
               //传入URL
               connection = (HttpURLConnection) url.openConnection();
               //GET表示希望从服务器那里获取数据
               connection .setRequestMethod("GET");
               //设置连接超时
               connection.setConnectTimeout(8000);
               //设置读取超时
               connection.setReadTimeout(8000);
               InputStream in = connection.getInputStream();
               reader = new BufferedReader(new InputStreamReader(in));
               StringBuilder response = new StringBuilder();
               String line;
               while ((line = reader.readLine()) != null) {
                   response.append(line);
               }
               //对结果进行处理
               showResponse(response.toString());
           } catch (Exception e) {
               e.printStackTrace();
           } finally {
                if (reader != null) {
                try {
                      reader.close();
                   } catch (IOException e) {
                      e.printStackTrace();
                   }
           }
            if (connection != null) {
                   connection.disconnect();
               }
        }
       }
    }).start();
}

private void showResponse(final String response) {
   runOnUiThread(new Runnable() {
       @Override
       public void run() {
           showTV.setText(response);
       }
   });
}

    这里将结果传入了showResponse()进行处理,里面调用了runOnUiThread()方法将返回的数据显示到TextView中,因为Android不允许在子线程中进行UI操作,而通过runOnUiThread()方法可以将子线程切换到主线程,然后再更新UI内容。也可以通过Android的异步消息处理机制,在主线程中建一个Handler对象用于接收和发送消息,子线程完成耗时操作后发消息给主线程更新UI。

OkHttp

    OkHttp是一个开源库,它能实现同一ip和端口的请求重用一个socket,这种方式能大大降低网络连接的时间,和每次请求都建立socket,再断开socket的方式相比,降低了服务器服务器的压力,对http和https都有良好的支持。

    使用前先添加依赖,目前的最新版本为3.10.0

//OkHttp
implementation 'com.squareup.okhttp3:okhttp:3.10.0'
//OKHttp
private void sendRequestWithOkHttp() {
    new Thread(new Runnable() {
       @Override
       public void run() {
           try {
               OkHttpClient client = new OkHttpClient();
               Request request = new Request.Builder().url("https://baidu.com").build();
               Response response = client.newCall(request).execute();
               String responseData = response.body().string();
               showResponse(responseData);
           } catch (Exception e) {
               e.printStackTrace();
           }
       }
    }).start();
}

     整个过程比HttpYRLConnection简单了许多,而且实际的加载速度也要快很多。


获取全局变量

    创建一个自定义的MyApplaication对象继承自Application

public class MyApplication extends Application {
  private static Context context;

    @Override
    public void onCreate() {
       super.onCreate();
       context = getApplicationContext();   
   }

   //静态方法:获取Context对象
   public static Context getContext() {
       return context;
   }
}

    修改AndroidManifest,告诉程序启动时初始化Myapplication类,而不是Application类

    

    但是这个方法不能滥用,最好是在不得已的情况下使用上述方法来获取context,而不是只要用到context就使用MyApplication.getContext(),因为这涉及到View等存在生命周期的问题,比如如Toast要用到的context就要使用

Activvity.this,否则可能报错。


二、明天计划的事情

     完成任务五中的下载功能


三、遇到的问题

    

四、收获

      对HttpURLConnection和OKHttp的基本用法有了了解。





返回列表 返回列表
评论

    分享到