Идентичный код, использующий httpurlconnection, работает в java-приложении, но не в andorid-приложении. Зачем? - PullRequest
0 голосов
/ 17 августа 2011

Это работает в приложении Java, запущенном в Eclipse:

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()));

Тот же код не работает в приложении Android в том же эмуляторе Eclipse +:

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 голосов
/ 30 августа 2017

Вы делаете это в основном потоке пользовательского интерфейса.Подключение к Интернету обычно занимает больше времени, чем поток пользовательского интерфейса.Попробуйте сделать это в классе Async Task в doInBackGround ().

Для получения дополнительной информации обратитесь к этому.https://developer.android.com/reference/android/os/AsyncTask.html

0 голосов
/ 05 июня 2018

В 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), вызывается в потоке пользовательского интерфейса после завершения фоновых вычислений.Результат фонового вычисления передается на этот шаг в качестве параметра.

, как указано на Android-разработчикам .Вы можете найти более подробную информацию об AsyncTask и о том, как его реализовать, по указанной ссылке.

0 голосов
/ 17 августа 2011

Вы не должны (и, как и Honeycomb, не можете) выполнять сетевую активность в потоке пользовательского интерфейса в Android, а onCreate выполняется в потоке пользовательского интерфейса.Проверьте статью на Безболезненная нить .Также ознакомьтесь с темой руководства Проектирование для отзывчивости .

...