android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<EditText
android:id="@+id/et_url"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入URL" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginTop="30dp" >
<TextView
android:id="@+id/tv_content"
android:layout_width="250dp"
android:layout_height="wrap_content"
android:text="内容" >
</TextView>
<Button
android:id="@+id/button_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:onClick="view"
android:text="查看" >
</Button>
</RelativeLayout>
</LinearLayout>
package com.example.sourcecode;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
private EditText editTextUrl;
private TextView textViewContent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editTextUrl = (EditText) findViewById(R.id.et_url);
textViewContent = (TextView) findViewById(R.id.tv_content);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public void view(View view) {
// 获取输入的URL
String url = editTextUrl.getText().toString();
if (TextUtils.isEmpty(url)) {
Toast.makeText(getApplicationContext(), "URL不能为空", Toast.LENGTH_LONG).show();
return;
}
// 根据URL设置源码内容
setContent(url);
}
private void setContent(final String inputUrl) {
new Thread() {
@Override
public void run() {
try {
// 获取网络URL
URL url = new URL(inputUrl);
URLConnection conn = url.openConnection();
conn.setConnectTimeout(5000);
// 获取输入流
InputStream is = conn.getInputStream();
// 内存输出流
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int temp;
while ((temp = is.read()) != -1) {
baos.write(temp);
}
final String content = baos.toString();
runOnUiThread(new Runnable() {
@Override
public void run() {
// 更新UI
textViewContent.setText(content);
}
});
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(), "Exception:" + e, Toast.LENGTH_LONG).show();
}
}
}.start();
}
}
使用ScrollView滚动视图来展示内容:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<EditText
android:id="@+id/et_url"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入URL" />
<ScrollView
android:layout_width="200dp"
android:layout_height="300dp"
android:scrollbars="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="30dp" >
<TextView
android:id="@+id/tv_content"
android:layout_width="250dp"
android:layout_height="wrap_content"
android:text="内容" >
</TextView>
</LinearLayout>
</ScrollView>
<Button
android:id="@+id/button_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="view"
android:text="查看" >
</Button>
</LinearLayout>
问题1:
主线程不能访问网络等耗时的操作,必须在子线程执行。否则就会报错:NetworkOnMainThreadException
问题2:
子线程不能直接更新UI,可以使用runOnUiThread来实现。否则就会报错:
子线程执行完要更新UI的时候,我们又必须回到主线程来更新,实现这一功能常用的方法是执行Activity的runOnUiThread()方法。
问题3:
没有设置网络访问权限就会报这个错:
Permission denied (missing INTERNET permission?)
发现类似问题,我们应该在AndroidManifest.xml(清单文件)中添加如下行,允许网络访问权限就可以了。
<uses-permission android:name="android.permission.INTERNET" />
总结:①主线程不能访问网络等耗时操作
②子线程不能直接更新UI(可使用runOnUiThread)
③访问网络需要配置权限:<uses-permission android:name="android.permission.INTERNET" />