Android开发学习之路--网络编程之初体验
一般手机都是需要上网的,一般我们的浏览器就是个webview。这里简单实现下下功能,先编写Android的layout布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_margin="10dp"
android:padding="10dp"
tools:context="com.example.jared.webviewstudy.MainActivity"> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:id="@+id/netAddress"
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/openNetAddress"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_weight="0"
android:text="Open"
android:textAllCaps="false"/>
</LinearLayout> <WebView
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="match_parent" /> </LinearLayout>
这里主要是一个EditText用来输入网址,然后一个Button用来打开网页,webView用来呈现网页。编写代码如下:
package com.example.jared.webviewstudy; import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.EditText; public class MainActivity extends AppCompatActivity { private WebView myWebView;
private EditText networkAddr;
private Button openNetwork; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); networkAddr = (EditText)findViewById(R.id.netAddress);
myWebView = (WebView)findViewById(R.id.webView); openNetwork = (Button)findViewById(R.id.openNetAddress);
openNetwork.setOnClickListener(new myOnClickListener());
} class myOnClickListener implements View.OnClickListener {
@Override
public void onClick(View view) {
myWebView.getSettings().setJavaScriptEnabled(true);
myWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});
String networkAddress = networkAddr.getText().toString();
myWebView.loadUrl("http://"+networkAddress);
}
}
}
还有就是权限问题了:
<uses-permission android:name="android.permission.INTERNET"/>
这里通过setWebViewClient方法,实例化一个WebViewClient,loadurl实现网页的加载。运行看下效果:
这里打开了百度和我的博客的地址,界面略难看,勉强看看了。
一般网络编程都是通过http的,下面就来实现下,首先是HttpURLConnection,这个一般是google官方提供的,还有一个HttpClient,本来有的,现在api23也没有了,需要自己加载进来。
先使用HttpURLConnection和HttpClient吧,新建工程,编写layout代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_margin="10dp"
tools:context="com.example.jared.httpurlconnectionstudy.MainActivity"> <Button
android:id="@+id/sendRequest"
android:text="发送请求"
android:layout_width="match_parent"
android:layout_height="wrap_content" /> <ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/response"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</ScrollView> </LinearLayout>
这里主要就是一个按钮获取数据,然后http请求的数据通过ScrollView可以滑动浏览更多的信息,然后把获取到的信息显示在TextView里面。
编写MainActivity,里面有实现了HttpURLConnection和HttpClient:
package com.example.jared.httpurlconnectionstudy; import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView; import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils; import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL; public class MainActivity extends AppCompatActivity { private static final int SHOW_RESPONSE = 1; private Button sendRequestBtn;
private TextView responseView; private Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case SHOW_RESPONSE:
String responseContent = (String)msg.obj;
responseView.setText(responseContent);
break;
}
}
}; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActionBar actionBar = getSupportActionBar();
actionBar.hide(); setContentView(R.layout.activity_main); responseView = (TextView)findViewById(R.id.response);
sendRequestBtn = (Button)findViewById(R.id.sendRequest);
sendRequestBtn.setOnClickListener(new myOnClickListener()); } private class myOnClickListener implements View.OnClickListener {
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.sendRequest:
String url = "http://www.baidu.com";
//sendRequestWithHttpURLConnection(url);
sendRequestWithHttpClient(url);
break;
default:
break;
}
}
} private void sendRequestWithHttpClient(final String url) {
new Thread(new Runnable() {
@Override
public void run() {
try {
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
HttpResponse httpResponse = httpClient.execute(httpGet);
if(httpResponse.getStatusLine().getStatusCode() == 200) {
HttpEntity entity = httpResponse.getEntity();
String response = EntityUtils.toString(entity, "utf-8"); Message message = new Message();
message.what = SHOW_RESPONSE;
message.obj = response.toString();
mHandler.sendMessage(message);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
} private void sendRequestWithHttpURLConnection(final String url) {
new Thread(new Runnable() {
@Override
public void run() {
HttpURLConnection connection = null;
try {
URL mUrl = new URL(url);
connection = (HttpURLConnection)mUrl.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(8000);
connection.setReadTimeout(8000);
InputStream in = connection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuilder response = new StringBuilder();
String line;
while((line = reader.readLine()) != null) {
response.append(line);
}
Message message = new Message();
message.what = SHOW_RESPONSE;
message.obj = response.toString();
mHandler.sendMessage(message);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (connection != null) {
connection.disconnect();
}
}
}
}).start();
}
}
这里的HttpClient需要在\sdk\platforms\android-23\optional下倒入包到工程目录的libs下面,然后
在build.gradle下面添加
// Apache Http
android {
useLibrary 'org.apache.http.legacy'
}
// Header
dependencies {
compile "org.apache.httpcomponents:httpcore:4.3.2"
}
这样HttpClient就可以使用了,关于加载别的库,也基本上类似了。
运行效果如下:
关于Http常用的框架有android-async-http,下面就使用下。jar包可以从官网下载:http://loopj.com/android-async-http/。此外还得下载一个httpclient的jar包:http://mvnrepository.com/artifact/cz.msebera.android/httpclient/4.4.1.1。
修改build.gradle如下:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.1'
compile files('libs/android-async-http-1.4.9.jar')
compile files('libs/httpclient-4.4.1.1.jar')
}
这里把两个包都放在了libs的目录下。切换到project目录,如下图:
修改MainActivity代码,添加sendRequestWithAsyncHttpClinet方法如下:
private void sendRequestWithAsyncHttpClient(String url) {
AsyncHttpClient client = new AsyncHttpClient();
client.get(url, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int i, Header[] headers, byte[] bytes) {
try {
String response = new String(bytes, 0, bytes.length, "UTF-8");
responseView.setText(response);
}catch (Exception e) {
e.printStackTrace();
}
} @Override
public void onFailure(int i, Header[] headers, byte[] bytes, Throwable throwable) { }
});
}
运行可以得到我们一样的效果。AsyncHttpClient很方便地可以使用起来了,比起上面一大堆代码简单了不少。这里通过一个get方法,然后再onSuccess方法中把获取到的数据转为String显示在text就ok了。
关于网络编程的webview和http就基本学到这里了。在此还要谢谢朋友的提醒,光学基础,实际项目会用到很多框架的,需要去熟悉,这里继续慢慢学。
Android开发学习之路--网络编程之初体验的更多相关文章
- Android开发学习之路--百度地图之初体验
手机都有gps和网络,通过gps或者网络可以定位到自己,然后通过百度,腾讯啊之类的地图可以显示我们的地理位置.这里学习下百度地图的使用.首先就是要申请开发者了,这个详细就不多讲了.http://dev ...
- Android开发学习之路--数据持久化之初体验
上班第一天,虽然工作上处于酱油模式,但是学习上依旧不能拉下,接着学习android开发吧,这里学习数据持久化的 知识. 其实数据持久化就是数据可以保存起来,一般我们保存数据都是以文件,或者数据库的形式 ...
- Android开发学习之路--Broadcast Receiver之初体验
学习了Activity组件后,这里再学习下另一个组件Broadcast Receiver组件.这里学习下自定义的Broadcast Receiver.通过按键自己发送广播,然后自己接收广播.新建MyB ...
- Android开发学习之路--Content Provider之初体验
天气说变就变,马上又变冷了,还好空气不错,阳光也不错,早起上班的车上的人也不多,公司来的同事和昨天一样一样的,可能明天会多一些吧,那就再来学习android吧.学了两个android的组件,这里学习下 ...
- Android开发学习之路--网络编程之xml、json
一般网络数据通过http来get,post,那么其中的数据不可能杂乱无章,比如我要post一段数据,肯定是要有一定的格式,协议的.常用的就是xml和json了.在此先要搭建个简单的服务器吧,首先呢下载 ...
- Web开发学习之路--Springmvc+Hibernate之初体验
本来想继续学习android的,可是用到了android和服务器交互,需要实现个login的功能,苦于没有这么个环境,那就只能自己来搭建了.既然已经基本上可以玩web了,那么接下来使用web开源的框架 ...
- Android开发学习之路--Android系统架构初探
环境搭建好了,最简单的app也运行过了,那么app到底是怎么运行在手机上的,手机又到底怎么能运行这些应用,一堆的电子元器件最后可以运行这么美妙的界面,在此还是需要好好研究研究.这里从芯片及硬件模块-& ...
- Android开发学习之路-RecyclerView滑动删除和拖动排序
Android开发学习之路-RecyclerView使用初探 Android开发学习之路-RecyclerView的Item自定义动画及DefaultItemAnimator源码分析 Android开 ...
- python学习之路网络编程篇(第四篇)
python学习之路网络编程篇(第四篇) 内容待补充
随机推荐
- [bzoj4868][Shoi2017]期末考试
来自FallDream 的博客,未经允许,请勿转载,谢谢. 有n位同学,每位同学都参加了全部的m门课程的期末考试,都在焦急的等待成绩的公布.第i位同学希望在第ti天或之前得知所.有.课程的成绩.如果在 ...
- bzoj3294[Cqoi2011]放棋子 dp+组合+容斥
3294: [Cqoi2011]放棋子 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 755 Solved: 294[Submit][Status] ...
- 用js来实现那些数据结构11(字典)
我们这篇文章来说说Map这种数据结构如何用js来实现,其实它和集合(Set)极为类似,只不过Map是[键,值]的形式存储元素,通过键来查询值,Map用于保存具有映射关系的数据,Map里保存着两组数据: ...
- SpringCloud学习之SpringCloudBus
一.spring-cloud-bus是什么? 回答这个问题之前,我们先回顾先前的分布式配置,当配置中心发生变化后,我们需要利用spring-boot-actuator里的refresh端点进行手动刷新 ...
- YOLO2:实时目标检测视频教程,视频演示, Android Demo ,开源教学项目,论文。
实时目标检测和分类 GIF 图: 视频截图: 论文: https://arxiv.org/pdf/1506.02640.pdf https://arxiv.org/pdf/1612.08242.pdf ...
- [坑况]饿了么你是这样的前端——vue+element ui 【this dependency was not found:'element-ui/lib/theme-chalk/index.css'】
element ui 坑况:今日pull代码,潇洒npm run dev ,被告知:this dependency was not found:'element-ui/lib/theme-chalk/ ...
- Linux学习之CentOS(七)---常用基本操命令1
cd pwd mkdir rmdir ls cp rm mv cat tac nl more less head tail touch ①目录管理:ls.cd. ...
- Oracle的dual
1.dual 确实是一张表.是一张只有一个字段,一行记录的表. 2.习惯上,我们称之为'伪表'.因为他不存储主题数据.3.他的存在,是为了操作上的方便.因为select 都是要有特定对象的.但如果我们 ...
- 48. Rotate Image(中等)
You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise). ...
- 转载c++常忘的知识点
C++的一些知识点比较零碎,下面清单的形式做一些记录与归纳,以供参考. 1.赋值操作符重载(深复制): (1)由于目标对象可能引用了以前的一些数据,所以应该先delete这些数据: (2)注意到对象可 ...