Исключение сети onMainThread для Android

1

Я пытаюсь получить доступ к серверу, чтобы получить строку JSON. Но, по-видимому, в Ice Cream Sandwich вы не можете выполнять сетевые операции в основном потоке, но класс AsyncTask меня смущает и не работает. Вот что у меня есть до сих пор:

//up in main code
Void blah = null;
URI uri = "kubie.dyndns-home.com/R2Bar2/ingredients.php";
new DownloadFilesTask().execute(uri , blah, blah);


private class DownloadFilesTask extends AsyncTask<URI, Void, Void> {
        protected Void doInBackground(URI... uri) {
            HttpClient client = new DefaultHttpClient();
            String json = "";
            int duration = Toast.LENGTH_SHORT;
            try {
                HttpResponse response = null;
                BufferedReader rd = null;
                String line = "";
                HttpGet request = new HttpGet(uri);
            } catch (URISyntaxException e1) {

            }
return null;
        }

        protected void onProgressUpdate(Integer... progress) {

        }

        protected void onPostExecute(Long result) {

        }

Это не нравится мой HttpGet request = new HttpGet(uri) Он говорит об изменении uri в URI, но это уже есть! Я попытался изменить все параметры на Void, но мое приложение просто принудительно закрывается.

Кто-нибудь знает, как это сделать?

Теги:
networking
android-asynctask
http-get
android-4.0

2 ответа

0
Лучший ответ

Попробуйте этот пример:

    public class Test_anroidActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        String uri = new String("http://kubie.dyndns-home.com/R2Bar2/ingredients.php");
        new DownloadFilesTask().execute(uri , null, null);
    }
    private class DownloadFilesTask extends AsyncTask<String, Void, String> {
        protected String doInBackground(String... urls) {
            HttpClient client = new DefaultHttpClient();
            String json = "";
            try {
                String line = "";
                HttpGet request = new HttpGet(urls[0]);
                HttpResponse response = client.execute(request);
                BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
                while ((line = rd.readLine()) != null) {
                    json += line + System.getProperty("line.separator");
                }
            } catch (IllegalArgumentException e1) {
                e1.printStackTrace();
            } catch (IOException e2) {
                e2.printStackTrace();
            }
            return json;
        }

        protected void onProgressUpdate(Void... progress) {

        }

        protected void onPostExecute(String result) {

        }
    }
}

Последний, ваш сервер возвращает файл php, это правильное поведение?

  • 0
    ДА! Спасибо вам большое! Я думаю, что то, что не работало, это уведомление о тосте. Я должен был вернуть свою строку, а затем декодировать JSON. Еще раз спасибо!
2

Но, по-видимому, в Ice Cream Sandwich вы не можете выполнять сетевые операции в основном потоке

Вы можете, но это даст вам предупреждение в LogCat. И вы не должны выполнять сетевые операции в главном потоке приложения, так как это заморозит ваш пользовательский интерфейс и, возможно, даст вам диалог "Приложение не отвечает" (ANR).

но класс AsyncTask запутывает меня и не работает

В вашем текущем коде вы фактически не выполняете запрос HttpGet.

Это не нравится мой запрос HttpGet = новый HttpGet (uri). Он говорит об изменении uri в URI, но это уже есть!

Нет.

После ... URI в объявлении doInBackground() означает, что этот метод принимает переменное количество аргументов. Ваш параметр uri, по сути, является URI[]. Если вы только вызываете execute() с одним URI, вы получаете этот URI через uri[0], а не uri.

  • 0
    К сожалению, я забыл добавить: 'try {response = client.execute (request); } catch (ClientProtocolException e) {'Но он все равно принудительно закрывается. Нужны ли какие-либо параметры для класса? Могу ли я просто создать URI в методе doInBackground ()?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню