1

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

//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, но мое приложение просто закроет.

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

ответ

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()? –

Смежные вопросы