若想使自己的android运用联网,必须要在AndroidManifest.xml中获取联网的权限,(即在里面添加 <uses-permission android:name="android.permission.INTERNET" />代码)
如下图所示:
然后就是写页面的代码了,(即:本文中的activity_main.xml文件)
<ScrollView 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" tools:context=".MainActivity" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="5dp" > <EditText android:id="@+id/edturl" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="输入网站" android:inputType="textUri" android:singleLine="true" /> <Button android:id="@+id/requesthtml" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="获取html代码" /> <EditText android:id="@+id/edthttp" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="这里显示的是你所输入的网站的HTML代码" /> </LinearLayout> </ScrollView>
重点来了,那是java文件的代码,不过,在这说一下注意的东西:在android 2.3版本以上,不能直接在主线程上联网,否则会抛出 android.os.NetworkOnMainThreadException的错误,这是因为在联网的过程中,程序会发送请求以便获取数据,但假如直接在主线程发送请求的话,页面就会卡住,进入假死状态。android后来版本为了预防这种情况,于是。。。。
因此,我们联网需要异步来操作。因为我之前都是用Thread的,现在想换换其它东西,就用了AsyncTask。
于是Java文件分为两部分,第一部分是控制页面效果和监听的,第二部分是用来执行异步操作。
第一部分代码如下:
import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; public class MainActivity extends Activity { // 定义组件 private EditText edtURL; private EditText edtHTTP; private Button btnRequest; private String strURL;// 用于存储网站地址 private MyTask myTask; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化组件 edtURL = (EditText) findViewById(R.id.edturl); edtHTTP = (EditText) findViewById(R.id.edthttp); btnRequest = (Button) findViewById(R.id.requesthtml); // 监听获取html代码的按钮 btnRequest.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (!(strURL = edtURL.getText().toString()).equals("")) { //实例myTask对象 myTask = new MyTask(edtHTTP); myTask.execute(strURL); } } }); } }
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; 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 com.xiaoyan.httpclienttest.R.integer; import android.os.AsyncTask; import android.widget.EditText; /** * 用于异步操作来读取网页中HTML代码 * * @author jianyan * */ public class MyTask extends AsyncTask<String, integer, StringBuffer> { private EditText edtHTTP;// 用于显示HTML代码 private StringBuffer sbHTML;// 用于储存HTML代码 public MyTask(EditText edtHTTP) { this.edtHTTP = edtHTTP; sbHTML = new StringBuffer(); } /** * doInBackground方法内部执行后台任务,不可在此方法内修改UI */ @Override protected StringBuffer doInBackground(String... params) { // 初始化HTTP的客户端 HttpClient hc = new DefaultHttpClient(); // 实例化HttpGet对象 HttpGet hg = new HttpGet(params[0]); try { // 让HTTP客户端已Get的方式请求数据,并把所得的数据赋值给HttpResponse的对象 HttpResponse hr = hc.execute(hg); // 使用缓存的方式读取所返回的数据 BufferedReader br = new BufferedReader(new InputStreamReader(hr .getEntity().getContent())); // 读取网页所返回的HTML代码 String line = ""; sbHTML = new StringBuffer(); while ((line = br.readLine()) != null) { sbHTML.append(line); } return sbHTML; } catch (IOException e) { edtHTTP.setText("获取网页HTML代码出错!!!"); } return null; } /** * onPostExecute方法用于在执行完后台任务后更新UI,显示结果 */ @Override protected void onPostExecute(StringBuffer result) { // 判断是否为null,若不为null,则在页面显示HTML代码 if (result != null) { edtHTTP.setText(result); } super.onPostExecute(result); } }
源码地址如下: