博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android网络编程1
阅读量:6530 次
发布时间:2019-06-24

本文共 5888 字,大约阅读时间需要 19 分钟。

最近在自学Android开发,从这篇开始作为我学习android开发的笔记,来记录学习过程中遇到的问题点和其解决的方法;

Ui界面代码

1 
2
12
17
22
27 28

界面后台代码

package com.example.lidezhen.myapplication;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.View;import android.widget.EditText;import android.widget.TextView;import java.io.ByteArrayOutputStream;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;public class MainActivity extends AppCompatActivity {    EditText et;    TextView tv;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);         et= (EditText) findViewById(R.id.text1);         tv= (TextView) findViewById(R.id.tv1);//        if (android.os.Build.VERSION.SDK_INT > 9) {//            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();//            StrictMode.setThreadPolicy(policy);//        }    }    public void Onclick(View v)    {        try {            String path=et.getText().toString();            URL url = new URL(path);             HttpURLConnection con = (HttpURLConnection) url.openConnection();            int code=con.getResponseCode();            if (code==200)            {                InputStream stream = con.getInputStream();                ByteArrayOutputStream os=new ByteArrayOutputStream();                int len=-1;                byte[] buff=new byte[1024];                while ( (len=stream.read(buff))!=-1)                {                   os.write(buff,0,len);                }                tv.setText(os.toString());            }        } catch (Exception e) {            Log.e("错误",e.toString());        }    }}编译并执行程序

 

 

  程序报错

07-20 02:30:00.361 15820-15820/com.example.lidezhen.myapplication E/错误: android.os.NetworkOnMainThreadException

错误原因:Android在4.0之前的版本 支持在主线程中访问网络,但是在4.0以后对这部分程序进行了优化,也就是说访问网络的代码不能写在主线程中了(我的虚拟机是android6.0的)

错误解决方法1:

在onCreate方法中添加如下代码

if (android.os.Build.VERSION.SDK_INT > 9) {            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();           StrictMode.setThreadPolicy(policy);        }

方法2:在点击事件里面添加多线程

public void Onclick(View v)    {        new Thread() {            @Override            public void run() {                try {                    String path=et.getText().toString();                    URL url = new URL(path);                    HttpURLConnection con = (HttpURLConnection) url.openConnection();                    int code=con.getResponseCode();                    if (code==200)                    {                        InputStream stream = con.getInputStream();                        ByteArrayOutputStream os=new ByteArrayOutputStream();                        int len=-1;                        byte[] buff=new byte[1024];                        while ( (len=stream.read(buff))!=-1)                        {                            os.write(buff,0,len);                        }                        tv.setText(os.toString());                    }                } catch (Exception e) {                    Log.e("错误",e.toString());                }            }        }.start();

程序执行成功

 这样开新线程后程序还是报错

07-20 02:49:12.203 32712-707/com.example.lidezhen.myapplication E/错误: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

意思就是新的线程不能操作界面控件

解决方法:添加handeler

package com.example.lidezhen.myapplication;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.View;import android.widget.EditText;import android.widget.TextView;import java.io.ByteArrayOutputStream;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;public class MainActivity extends AppCompatActivity {    EditText et;    TextView tv;    @Override            protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);         et= (EditText) findViewById(R.id.text1);         tv= (TextView) findViewById(R.id.tv1);//       if (android.os.Build.VERSION.SDK_INT > 9) {//            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();//           StrictMode.setThreadPolicy(policy);//        }    }    public void Onclick(View v)    {        new Thread() {            @Override            public void run() {                try {                    String path=et.getText().toString();                    URL url = new URL(path);                    HttpURLConnection con = (HttpURLConnection) url.openConnection();                    int code=con.getResponseCode();                    if (code==200)                    {                        InputStream stream = con.getInputStream();                        ByteArrayOutputStream os=new ByteArrayOutputStream();                        int len=-1;                        byte[] buff=new byte[1024];                        while ( (len=stream.read(buff))!=-1)                        {                            os.write(buff,0,len);                        }//                        tv.setText(os.toString());                        Message msg=new Message();                        msg.obj=os.toString();                        handler.sendMessage(msg);                    }                } catch (Exception e) {                    Log.e("错误",e.toString());                }            }        }.start();    }   Handler handler=new Handler(){       public void handleMessage(Message msg) {           String s=(String)msg.obj;         tv.setText(s);       }   };}

这样就不会再报异常

转载于:https://www.cnblogs.com/lidezhen/p/5687475.html

你可能感兴趣的文章
图解正向代理、反向代理、透明代理(转载)
查看>>
设置java输出文本文件时的编码
查看>>
活动目录系列之七:信任(上)
查看>>
爱你wanling
查看>>
修改DISCUZ支持又拍云缩略图
查看>>
javascript自动生成select的option
查看>>
Play源码深入之二:Play应用启动时框架的初始化
查看>>
轮子除了开车,还能摊大饼——地址服务器的一个“另类”用法
查看>>
php木马问题
查看>>
vim常用命令
查看>>
yum源安装zabbix图形中文乱码解决
查看>>
php生成带数字字母的barcode
查看>>
python 64系统的 库资源
查看>>
MySQL学习笔记1 mysql简介
查看>>
路漫漫吾将上下而求索
查看>>
无敌js弹窗
查看>>
GNS3配置SecureCRT
查看>>
【中级篇】Linux下部署LNMP架构及应用
查看>>
我的友情链接
查看>>
定时任务CronExpression配置说明
查看>>