Android下载文件常见错误解决方法

最近在学习Mars老师的Android开发课程,仿照http://www.cnblogs.com/Laupaul/archive/2012/02/12/2348293.html的代码来写应用,结果中间出了各种各样的问题,在这里总结一下:

1. java.lang.NullPointerException报错,android.os.NetworkOnMainThreadException异常

原因:urlCon.getInputStream()执行的时候出错导致,得不到InputStream。这个异常大概意思是在主线程访问网络时出的异常。 造成这样的错误原因是代码不符合Android规范,Android在4.0之前的版本支持在主线程中访问网络,但是在4.0以后对这部分程序进行了优化,也就是说访问网络的代码不能写在主线程中了。

解决办法:

改用多线程,异步加载的方式:

    String lrc;

    Handler handler = new Handler() {
        public void handleMessage(Message msg) {
            if(msg.what == 0x123) {
                System.out.println(lrc);
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_download);
        downloadTxtButton = (Button)findViewById(R.id.downloadTxt);
        downloadMp3Button = (Button)findViewById(R.id.downloadMp3);
        textview = (TextView)findViewById(R.id.textview);
        downloadTxtButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                new Thread() {
                    public void run() {
                        HttpDownloader httpDownloader = new HttpDownloader();
                        lrc = httpDownloader.download("http://127.0.0.1/android_download/white_black.lrc");
                        handler.sendEmptyMessage(0x123);
                        textview.setText(lrc);
                    }
                }.start();
            }
        });
    }


2. android从tomcat读取文件出错:connect failed: ECONNREFUSED

本地启tomcat,当想让android从本地服务器上下载文件时,url中IP地址写127.0.0.1或localhost在模拟器中无效:

W/System.err(12527): java.net.ConnectException: failed to connect to localhost/127.0.0.1 (port 8080): connect failed: ECONNREFUSED (Connection refused)

改为本机的IP地址也显示无法连接,终于在网上找到一个非常简便的方式:android把127.0.0.1当作模拟器本机,而把计算机本地IP设为10.0.2.2,所以只需要把需连接本地计算机web服务地址改为:http://10.0.2.2即可。

3.Only the original thread that created a view hierarchy can touch its views报错

Android的相关View和控件不是线程安全的,从报错信息可以得知只能由产生View的线程对它做改变,因此将textview.setText(lrc);放到handleMessage()里即可。

4. 写文件到SD卡时出错:java.io.IOException: open failed: EACCES (Permission denied)

Manifest里也配置了权限

<uses-permission android:name="android.permission.INTERNET"/>  
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 


原因是模拟器的SD卡大小没有设置,在AVD Manager里将模拟器的SD卡size设置一下,再跑就没问题了。


经过一番折腾,终于出了结果:

img

目前还是新手,所以出了问题就各种不知所措,经验还是需要慢慢积累的~


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值