处理Android中的IO异常

时间:2014-12-28 21:09:43

标签: java android exception-handling ioexception

我正在创建一个应用,我需要一个功能来从网站获取纯文本。我能够在我的电脑上得到文本并将其打印出来,但是当我尝试在Android设备上运行时,应用程序就不会启动。

我认为它与抛出IOException有关。我一直在读,因为我没有定义界面,所以我不应该这样做。有办法解决这个问题吗?如果我不抛弃异常,Android Studio就不会编译我的代码。

功能:

public String getText(String site) throws IOException {
    // Make a URL to the web page
    URL url = new URL(site);

    // Get the input stream through URL Connection
    URLConnection con = url.openConnection();
    InputStream is =con.getInputStream();
    BufferedReader br = new BufferedReader(new InputStreamReader(is));

    // read each line and return the final text
    String res = "";
    String line = null;
    while ((line = br.readLine()) != null) {
        //System.out.println(line);
        res += line;
    }
    return res;
}

这就是Android Studio让我在onCreate方法中运行它的方式:

String text = null;
    try {
        text = getText("http://myWebsite.com");
    } catch (IOException e) {
        e.printStackTrace();
    }

    Toast.makeText(getApplicationContext(), text, Toast.LENGTH_LONG).show();

2 个答案:

答案 0 :(得分:0)

首先,阅读您的logcat - 您应该在那里看到完全堆栈跟踪的异常。其次,捕获IOException没有任何问题,但是一旦缓存,你必须对它做一些事情 - 比如告诉用户功能问题 - 比如没有更多空间等等。

  

这就是Android Studio让我在onCreate方法中运行它的方式:

这是一个问题,因为你是在UI线程上从你的站点获取数据,你必须从工作线程,即。的AsyncTask。

答案 1 :(得分:0)

您无法在主线程

中执行此操作

试试这个

class MyTask extends AsyncTask<Void, Void, String>{
        private String site;

        MyTask(String site) {
            this.site = site;
        }

        @Override
        protected String doInBackground(Void... params) {
            try {
                URL url = new URL(site);
                URLConnection con = url.openConnection();
                InputStream is =con.getInputStream();
                BufferedReader br = new BufferedReader(new InputStreamReader(is));

                // read each line and return the final text
                String res = "";
                String line = null;
                while ((line = br.readLine()) != null) {
                    //System.out.println(line);
                    res += line;
                }
                return res;
            } catch (IOException e) {
                e.printStackTrace();
            }    
            return null;
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            if(s != null){
                Toast.makeText(getApplicationContext(), s, Toast.LENGTH_LONG).show();
            }
        }
    }

获取字符串的位置用作

new MyTask("http://myWebsite.com").execute()