Я пытаюсь получить доступ к серверу, чтобы получить строку 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, но мое приложение просто принудительно закрывается.
Кто-нибудь знает, как это сделать?
Попробуйте этот пример:
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, это правильное поведение?
Но, по-видимому, в Ice Cream Sandwich вы не можете выполнять сетевые операции в основном потоке
Вы можете, но это даст вам предупреждение в LogCat. И вы не должны выполнять сетевые операции в главном потоке приложения, так как это заморозит ваш пользовательский интерфейс и, возможно, даст вам диалог "Приложение не отвечает" (ANR).
но класс AsyncTask запутывает меня и не работает
В вашем текущем коде вы фактически не выполняете запрос HttpGet
.
Это не нравится мой запрос HttpGet = новый HttpGet (uri). Он говорит об изменении uri в URI, но это уже есть!
Нет.
После ...
URI
в объявлении doInBackground()
означает, что этот метод принимает переменное количество аргументов. Ваш параметр uri
, по сути, является URI[]
. Если вы только вызываете execute()
с одним URI
, вы получаете этот URI
через uri[0]
, а не uri
.