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

本文介绍了如何在Android应用中利用Handler和AsyncTask进行单线程网络连接操作,并展示了如何将读取的网页内容动态加载并显示到界面上。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值