Исключение сети onMainThread для Android - PullRequest
1 голос
/ 16 марта 2012

Я пытаюсь получить доступ к серверу, чтобы получить строку 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, но мое приложение просто принудительно закрывается.

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

Ответы [ 2 ]

2 голосов
/ 16 марта 2012

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

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

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

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

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

Нет, это не так.

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

0 голосов
/ 16 марта 2012

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

    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 файл, это правильное поведение?

...