Android studio 编写安卓程序,实现 http 通信,获得百度主页源代码。
------------------------------------------------------------- ------------------------------------------------------------
不要惊讶,这是一条手动的分割线,为什么用手动的呢?因为这么久了,我还是不会用博客园自带的分割线
------------------------------------------------------------ -------------------------------------------------------------
1. 首先创建一个Android项目,这个应该不需要教了,创建Android项目都不会的话,这篇垃圾博客也看不懂。下面是创建好的Android项目目录结构(其实这都不是重点!)。
2. 实现http通信首先得给我们的Android项目添加网络权限,这一点很重要!!!!相当重要!忘记你会哭死!!!!记住,网络权限!!!!
打开 AndroidManifest.xml 文件
在 </application> 这一句下面添加网络权限!
<uses-permission android:name="android.permission.INTERNET" />
添加完成保存,这一步就完成了,很简单但是很重要!!
3. 编写界面布局。
这个根据自己需要去写就行,比如我们随便写点控件,在写一个button按钮,点击之后去获得百度(https://www.baidu.com/)的网页源代码展示在一个 textview 中,就button有用,其他的都没有用,不写也没关系。
activity_main.xml 文件代码
<?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:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:orientation="vertical" tools:context="com.example.administrator.eschool.MainActivity"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:textSize="25dp" android:text="ESchool 大学生校园交易平台" /> <EditText android:id="@+id/username" android:layout_width="match_parent" android:hint="请输入您的用户名" android:layout_height="wrap_content" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="textPassword" android:hint="请输入您的密码" android:ems="10" android:id="@+id/password" /> <!--点击button来获取百度主页源代码--> <Button android:id="@+id/login" android:layout_width="wrap_content" android:layout_gravity="center" android:text="确认登录" android:layout_height="wrap_content" /> <!--用来展示获取到的源码--> <TextView android:text="TextView" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/textView" /> </LinearLayout>
布局代码完成之后呢,界面大体是这个样子的。
OK! 界面和权限设置成功就是我们的关键java代码了。
4. 编写 java 代码。
首先打开 MainActivity.java 文件,编写代码。
其实有一个插件挺好用的,他会给你自动生成一些基础代码,例如声明按钮之类的,特别好用,特别方便,其实不用手敲也行,我一直用,会节约点时间。插件的名字叫做 —— LayoutCreate 。 需要的话自己安装,用Android studio就可以安装,不用去网上找安装包。
下面是 java代码 ,自己看,应该没有什么难的地方,能看懂。
package com.example.administrator.eschool; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.text.TextUtils; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; 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 java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private EditText username; private EditText password; private Button login; private HttpGet httpGet = null; HttpClient httpClient = null; private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); textView.setText(msg.obj.toString()); } }; private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { username = (EditText) findViewById(R.id.username); password = (EditText) findViewById(R.id.password); login = (Button) findViewById(R.id.login); login.setOnClickListener(this); textView = (TextView) findViewById(R.id.textView); textView.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.login: submit(); break; } } private void submit() { // validate String usernameString = username.getText().toString().trim(); if (TextUtils.isEmpty(usernameString)) { Toast.makeText(this, "请输入您的用户名", Toast.LENGTH_SHORT).show(); return; } String passwordString = password.getText().toString().trim(); if (TextUtils.isEmpty(passwordString)) { Toast.makeText(this, "请输入您的密码", Toast.LENGTH_SHORT).show(); return; } // TODO validate success, do something new Thread(new Runnable() { @Override public void run() { // 生成一个请求对象 httpGet = new HttpGet("https://www.baidu.com"); // 生成一个http客户端对象 httpClient = new DefaultHttpClient(); // 用客户端发送请求对象 try { HttpResponse httpResponse = httpClient.execute(httpGet); // 接收http返回的响应 HttpEntity httpEntity = httpResponse.getEntity(); // 获得http响应的内容 InputStream inputStream = httpEntity.getContent(); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); String result = ""; String line = ""; while ((line = reader.readLine()) != null) { result += line; } Message msg = new Message(); msg.obj = result; mHandler.sendMessage(msg); } catch (IOException e) { e.printStackTrace(); } } }).start(); } }
运行项目,在输入框输点东西,因为不输东西代码就 return了,不往下运行,代码很明白!输完之后点击按钮就出现效果了。大功告成!
5. 有几点问题需要注意:
1. http 通信要单独开一个线程进行操作,也就是说,点击 button 按钮之后,要开一个线程来运行访问的代码,不能再主线程里进行 http 通信!不然会报错。
2. 再子线程获得 http 响应返回的内容之后必须通过 handler 将数据返回到主线程进行数据展示,也就是说,不能再子线程里操作 界面控件。
3. 要会 线程 和 handler 的操作。
4. 如果要用Android真机测试,如果Android studio找不到手机很可能是缺少驱动,手机和电脑都下载一个360手机助手的软件,通过360手机助手让手机和电脑连起来,再去Android studio就会发现能找到手机了,驱动打好就可以卸载了360手机助手,留着也行,随意。
OK!任务完成!