您的位置:首页 > 理论基础 > 计算机网络

Amdroid网络连接---URL连接及单线程网络下载

2015-09-12 16:16 417 查看
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);
        }
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: