Android加载一些数据

时间:2013-01-05 16:04:00

标签: android exception

所以我有一个问题,为什么我的函数getIt()httpGet处中断并给出Exception,在清单中我添加了INTERNET权限!我没有使用AsyncTask,因为我需要创建一个新类,如果我用get调用AsyncTask它会阻止我的UI

Class.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;
    }       
}

3 个答案:

答案 0 :(得分:1)

您的应用程序在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. 打开套接字连接(即新的套接字())。
  2. HTTP请求(即HTTPClient和HTTPUrlConnection)。
  3. 正在尝试连接到远程MySQL数据库。
  4. 下载文件(即Downloader.downloadFile())。
  5. 如果您尝试在UI线程上执行任何这些操作,则必须将它们包装在工作线程中。最简单的方法是使用AsyncTask,它允许您在用户界面上执行异步工作。 AsyncTask将在工作线程中执行阻塞操作,并将结果发布到UI线程上,而不需要您自己处理线程和/或处理程序。

答案 1 :(得分:0)

  

如果我调用AsyncTask并使其阻止我的UI

因为正如doc所说的那样AsyncTask get ()

  

如果需要等待计算完成,然后检索   结果。

避免阻止用户界面使用AsyncTask而不在UI线程上调用get方法,并在doInBackground执行完onPostExecute时更新用户界面。

将AsyncTask类创建为:

public class LongloadMovies extends AsyncTask<String, Void, String> {

      @Override
      protected String doInBackground(String... params) {

            loadMovies loadmovobj =new loadMovies();
            String strresult=loadmovobj.getIt();
            return strresult;
      }      

      @Override
      protected void onPostExecute(String result) {     

           // Update your UI here          
      }

}

从UI线程执行AsyncTask:

new LongloadMovies().execute("");

答案 2 :(得分:0)

您无法在主ui线程上进行网络操作。您需要在另一个线程或异步任务中执行此操作。 Here讨论这个