ScrollView只能有一个子控件,子控件可以嵌套其他控件
UI线程中不能使用网路连接,必须新建一个线程创建连接,那么就可以使用Handler和Anynctask,当然作为网络连接肯定是有权限,Webview写了在这不赘述
首先使用用Handler:
在button点击事件中新建一个线程用于连接网络:
public void onClick(View v) {
switch (v.getId()){
case R.id.button_url:
Thread thread=new Thread(new Runnable() {
@Override
public void run() {
connectServlet();//调用用于网络连接的方法
}
});
thread.start();
break;
}
}
用于网络连接的方法:
private void connectServlet() {
try {
URL url=new URL("http://www.360.com"); //跟java中一样的写法
URLConnection connection=url.openConnection();
InputStream is=connection.getInputStream();//得到输入流
BufferedReader bf=new BufferedReader(new InputStreamReader(is));
String line=bf.readLine();
StringBuffer buffer=new StringBuffer();
while (!line.isEmpty()){
line=bf.readLine();
buffer.append(line);//动态加载读取的网页内容
Log.d("", line);
Message msg=handler.obtainMessage();//发送message给Handler,显示到Texview
msg.obj=buffer.toString().trim();//去除空格
msg.what=CONNECT;
handler.sendMessage(msg);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
初始化Handler,用Handler把message放到Textview上显示,最后的结果是网页源码,因为是按字节读的网页:
private Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case CONNECT:
String message= (String) msg.obj;
mTextview_show.setText(message);//把读取的网页显示到textview上
break;
}
}
};
现在在写一个用Anynctask的单线程网络下载任务,因为是封装好的,所以按格式写就好了,直接上代码:
省略控件声明、inviewbyid、以及balabala~
public void onClick(View v) {
switch (v.getId()){
case R.id.button_single:
MySingleDownloadtask task =new MySingleDownloadtask();
task.execute();//启动task
break;
case R.id.button_more:
break;
}
}
class MySingleDownloadtask extends AsyncTask<String,Integer,String>{
@Override
protected String doInBackground(String... params) {
try {
URL url=new URL("http://192.168.0.30:8080/MyWebTest/music/aa.mp3");
//连接服务器文件绝对路径
URLConnection connection=url.openConnection();
int length=connection.getContentLength();
InputStream is=connection.getInputStream();//得到输入流
File file=new File(Environment.getExternalStorageDirectory(),"aa.mp3");
if (!file.exists()){//文件是否存在
file. createNewFile();
}
FileOutputStream os=new FileOutputStream(file);//给file建立输出流
byte[] array=new byte[1024];
int data=is.read(array);
int sum=0;
while (data!=-1){
os.write(array,0,data);//从数组偏移量0开始写data到输出流
sum+=data;
publishProgress(sum, length);
data=is.read(array);
}
os.flush();
os.close();
is.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
int progress= (int) (values[0]*100.0/values[1]);//转换成百分比形式,不用写setMax
progressBar.setProgress(progress);
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
}
}
}