Android加载一些数据

标签 android exception

所以我有一个问题,为什么我的函数 getIt()httpGet 中断并给出 Exception,在 list 中我添加了 互联网许可!我没有使用 AsyncTask,因为我需要创建一个新类,如果我用 get 调用 AsyncTask,它会阻塞我的 UI

类.java

public class loadMovies{
    public String getIt(){
        InputStream ips = null;
        JSONObject json = null;
        String get = "";
        HttpClient client = new DefaultHttpClient();
        HttpGet httpGet = new HttpGet("http://mysite/app/movies");
        try {
            HttpResponse response = client.execute(httpGet);
            ips = response.getEntity().getContent();

            BufferedReader buffer = new BufferedReader(new InputStreamReader(ips));
            StringBuilder builder = new StringBuilder();
            String line;

            while((line = buffer.readLine()) != null){
                builder.append(line+"\n");
            }
            json = new JSONObject(builder.toString());
            Log.d(TAG, json.toString());
        }
        catch(Exception e){ e.printStackTrace(); }

        if(json != null){
            JSONArray array = json.optJSONObject("data").optJSONArray("movies");

            for(int i = 0; i < array.length(); i++){
                JSONObject rss = array.optJSONObject(i);
                get += rss.optString("name")+"\n";
            }
        }
        return get;
    }       
}

最佳答案

您的应用程序在 Android 3.0 及更高版本上崩溃的原因是因为 HoneyComb、Ice Cream Sandwich 和 JellyBean 对 UI 线程的滥用更加严格。例如,当运行 HoneyComb 或以上版本的 Android 设备在 UI 线程上检测到网络访问时,将抛出 NetworkOnMainThreadException:

E/AndroidRuntime(673): java.lang.RuntimeException: Unable to start activity
ComponentInfo{com.example/com.example.ExampleActivity}: android.os.NetworkOnMainThreadException

关于为什么会发生这种情况的解释在 Android 开发者网站上有详细记录:

A NetworkOnMainThreadException is thrown when an application attempts to perform a networking operation on its main thread. This is only thrown for applications targeting the Honeycomb SDK or higher. Applications targeting earlier SDK versions are allowed to do networking on their main event loop threads, but it's heavily discouraged. 

ICS 和 HoneyComb 不允许您在 UI 线程上执行的其他操作的一些示例是:

  1. 打开 Socket 连接(即 new Socket())。
  2. HTTP 请求(即 HTTPClient 和 HTTPUrlConnection)。
  3. 正在尝试连接到远程 MySQL 数据库。
  4. 下载文件(即 Downloader.downloadFile())。

如果您试图在 UI 线程上执行任何这些操作,则必须将它们包装在工作线程中。最简单的方法是使用 AsyncTask,它允许您在用户界面上执行异步工作。 AsyncTask 将在工作线程中执行阻塞操作,并将结果发布到 UI 线程上,而不需要您自己处理线程和/或处理程序。

关于Android加载一些数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14173563/

相关文章:

Java套接字: best way to retry upon Connection Refused exception?

调用 HttpUrlConnection.connect() 时出现 javax.net.ssl.SSLProtocolException

java - 两个 Realm 模块可以有相同的类吗?

java - 回收器适配器中菜单的 setOnMenuItemClickListener

android - 如何去除Button的背景资源?

ios - 在 Xcode 中,有没有办法绕过一行或多行的 "All Exceptions"断点?

silverlight - 响应式扩展中的跨线程异常与限制

asp.net - 数以千计的 TaskCanceledException 异常

c++ - boost::python 导出自定义异常并继承自 Python 的 Exception

android - instrumentTest 源集可以有自己的 Assets 吗?