相同的代码使用httpurlconnection,在java应用程序中工作但不是Android应用程序。为什么?

时间:2011-08-17 00:29:34

标签: android httpurlconnection

这适用于在Eclipse中运行的Java应用程序:

URL yahoo = new URL("http://www.nytimes.com/2011/08/17/business/global/merkel-arrives-in-paris-to-begin-economic-talks-with-sarkozy.html?_r=1&hp");
yc = (HttpURLConnection) yahoo.openConnection();
yc.setRequestProperty("User-Agent","sdfdfvjavasdvdsv");
in = new BufferedReader(new InputStreamReader(yc.getInputStream()));

相同的代码在同一个Eclipse +模拟器中的Android应用程序中不起作用:

public void onCreate(Bundle savedInstanceState) {
    URL yahoo = new URL("http://www.nytimes.com/2011/08/17/business/global/merkel-arrives-in-paris-to-begin-economic-talks-with-sarkozy.html?_r=1&hp");
    yc = (HttpURLConnection) yahoo.openConnection();
    yc.setRequestProperty("User-Agent","sdfdfvjavasdvdsv");
    in = new BufferedReader(new InputStreamReader(yc.getInputStream()));
}

它们是相同的;一个作为Java应用程序运行,另一个作为Android应用程序运行。 Android应用程序获得了许多重定向,并最终超时。 Android应用程序是否会发送一些特别的内容来勾选nytimes.com?

3 个答案:

答案 0 :(得分:0)

你不应该(并且,从Honeycomb开始,不能)在Android的UI线程上进行网络活动,并且onCreate在UI线程上执行。查看Painless Threading上的文章。另请参阅指南主题Designing for Responsiveness

答案 1 :(得分:0)

您正在主UI线程中执行此操作。互联网连接通常比UI线程花费更多时间。 尝试在doInBackGround()中的Async Task类中执行此操作。

有关更多信息,请参阅此内容。 https://developer.android.com/reference/android/os/AsyncTask.html

答案 2 :(得分:0)

在android中你应该使用AsyncTask来实现你想要的。 AsyncTask的一个例子看起来像这样:

private class FetchData extends AsyncTask<String, String, String>> {
    ProgressDialog progress;



    @Override
    protected void onPreExecute() //Starts the progress dailog
    {
        progress = ProgressDialog.show(YourActivity.this, "Loading...",
                "", true);
    }

    @Override
    protected String doInBackground(String... strings)
    {
    String result="";
    URL yahoo = new URL("http://www.nytimes.com/2011/08/17/business/global/merkel-arrives-in-paris-to-begin-economic-talks-
                with-sarkozy.html?_r=1&hp");
        yc = (HttpURLConnection) yahoo.openConnection();
        yc.setRequestProperty("User-Agent","sdfdfvjavasdvdsv");
        in = new BufferedReader(new InputStreamReader(yc.getInputStream()));
        //do sth with your data here

    return result;
    }

    @Override
    protected void onPostExecute(ArrayList<Article> result)
    {
        progress.dismiss();

    }
}

请记住

  

onPostExecute(Result),在后台计算完成后在UI线程上调用。后台计算的结果作为参数传递给此步骤。

Android developers所述。 您可以在提供的链接上找到有关AsyncTask以及如何实现它的更多信息。