2014-01-05 2 views
0

Я хочу сделать простой HTTP-заголовок для URL-адреса, который извлекается из текстового поля. Каждый раз, когда я ввожу URL-адрес и нажимаю для получения ответа HTTP, приложение становится нерепрессивным. Вот код:Android HTTP Request Making App Irresponsive

public void MakeRequest(View v) 
{ 
    EditText mEdit; 
    TextView txtresponse; 
    txtresponse = (TextView)findViewById(R.id.textView1); 
    mEdit = (EditText)findViewById(R.id.editText1); 
    HttpClient httpClient = new DefaultHttpClient(); 
    HttpHead httphead = new HttpHead(mEdit.getText().toString()); 

    try { 
     HttpResponse response = httpClient.execute(httphead); 
     txtresponse.setText(response.toString()); 
    } catch (ClientProtocolException e) { 
     // writing exception to log 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // writing exception to log 
     e.printStackTrace(); 

    } 
} 
+0

При выполнении сетевого ввода-вывода из потока пользовательского интерфейса, приложение будет замерзать до тех пор, пока операция занимает. После того, как приложение завершится, приложение должно снова стать отзывчивым. Рассмотрите возможность выполнения операций блокировки в другом потоке, например, через «AsyncTask». – JimmyB

ответ

0

Возможно, вы выполняете запрос в потоке пользовательского интерфейса. Это плохая практика, так как она отвечает за всю работу, выполняемую для пользовательского интерфейса. Вы можете узнать больше об этом here.

Лучшим способом было бы сделать это в другом потоке. Это может быть выполнено, например,

  • пользовательский рабочий поток или
  • AsyncTask.

Пример с AsyncTask (это идет внутри класса):

public void MakeRequest(View v) 
{ 
    EditText mEdit; 
    mEdit = (EditText)findViewById(R.id.editText1); 
    new RequestTask().execute(mEdit.getText().toString()); 
} 

private class RequestTask extends AsyncTask<String, Void, String> { 

    @Override 
    protected String doInBackground(String... params) { 
     HttpClient httpClient = new DefaultHttpClient(); 
     HttpHead httphead = new HttpHead(params[0]); 

     try { 
      HttpResponse response = httpClient.execute(httphead); 
      return response.toString(); 
     } catch (ClientProtocolException e) { 
      // writing exception to log 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // writing exception to log 
      e.printStackTrace(); 
     } 
     return ""; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     TextView txtresponse; 
     txtresponse = (TextView)findViewById(R.id.textView1); 
     txtresponse.setText(result); 
    } 

    @Override 
    protected void onPreExecute() {} 

    @Override 
    protected void onProgressUpdate(Void... values) {} 
} 
1

Никогда не выполнять длительные задачи на тему UI (и HTTP Request/Response может занять очень много времени из-за сервер латентность). Запустите обработку HTTP в фоновом потоке. Есть несколько примеров на Stackoverflow - как Make an HTTP request with android и, конечно, читать на Android сайта - http://developer.android.com/training/articles/perf-anr.html