2013-08-07 3 views
2

Я знаю Java, но, к сожалению, выбрал Basic4Android для Android Development. После работы над годом я понял, что должен двигаться в собственном решении. Поэтому мой вопрос может быть глупым, но мне нужен ваш совет для его решения.Android HTTP GET не работает

Моя цель - получить данные из запроса GET. Я пробовал тонны HTTP-клиентских программ для Android через Интернет, но не смог с каждым учебником. Я просто собираюсь поделиться этим, чтобы вы могли помочь мне исправить. Когда я нажимаю кнопку, ничего не происходит без тонны сообщения об ошибке в окне logcat.

Main Class здесь для краткого обзора:

public class MainActivity extends Activity implements OnClickListener { 

    private Button Test; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Test = (Button) findViewById(R.id.Test); 
     Test.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     if (v.getId() == R.id.Test){ 
      try { 
       HttpClient client = new DefaultHttpClient(); 
       String getURL = "http://www.google.com"; 
       HttpGet get = new HttpGet(getURL); 
       HttpResponse responseGet = client.execute(get); 
       HttpEntity resEntityGet = responseGet.getEntity(); 
       if (resEntityGet != null) { 
        // do something with the response 
        String response = EntityUtils.toString(resEntityGet); 
        Log.i("GET RESPONSE", response); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      } 
     } 
    } 

И весь проект здесь: https://dl.dropboxusercontent.com/u/15625012/TestHttp.zip

Я действительно ценю любого рода помощь/советы.

+0

Какой клиент это? Благодарю. – Tom

ответ

1

В настоящее время вы делаете сетевой доступ в своем основном потоке пользовательского интерфейса (функция нажатия кнопок). Android не разрешает длительные операции, такие как доступ к сети в потоке нитей основного потока приложения. Вы должны сделать это асинхронно в отдельном потоке. Для этой цели вы можете использовать встроенный класс Async.

Вот пример кода, я написал

public class Sample extends Activity 
{ 
private ProgressDialog progress_dialog; 

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_sample); 

    progress_dialog = new ProgressDialog(this); 
} 

public void MyButtonClick(View view) 
{ 
     EditText usernameEditText = (EditText)findViewById(R.id.sample_username); 
     String username = usernameEditText.getText(); 

     String URL = "http://SOME_WEBSITE?Username=" + username; 

     progress_dialog.setMessage("Loading. Please wait..."); 
    progress_dialog.setCancelable(false); 
    progress_dialog.show(); 

    new SampleAsynThread().execute(URL); 
} 

private class SampleAsynThreadextends AsyncTask <String, Void, String> 
{ 
     protected String doInBackground(String... urls) 
     { 
      // make your request here 
      return "Response"; 
     } 

     protected void onPostExecute(String result) 
     { 
      // show response on ui 
      progress_dialog.dismiss(); 
     } 
    } 

protected void onDestroy() 
{ 
    progress_dialog.dismiss(); 
    super.onDestroy(); 
} 

@Override 
protected void onPause() 
{ 
    progress_dialog.dismiss(); 
    super.onPause(); 
} 

} 
1

Сначала всегда указывайте ошибки в logcat здесь, мы почти всегда нуждаемся в них, чтобы исправить проблему.

Но здесь легко - вы не можете выполнить сетевое IO на основной теме. Вам нужно запустить его на AsyncTask или Thread.

1
try { 
     URL url = new URL(urlstr); 
     HttpsURLConnection connection = 
        (HttpsURLConnection)url.openConnection(); 
     connection.setReadTimeout(6000); 
     connection.setRequestMethod("GET"); 
     connection.setRequestProperty("User_agent", "android"); 
     OutputStream os = connection.getOutputStream(); 
     //os.write(buffer); 

     InputStream is = connection.getInputStream(); 

    } catch (MalformedURLException e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    }catch (Exception e) { 
     // TODO: handle exception 
    }