2015-04-13 2 views
0

У меня есть этот код: AndroidAndroid HTTPClient вызывает приложение к сбою

package com.XXX 

import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.ResponseHandler; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.BasicResponseHandler; 
import org.apache.http.impl.client.DefaultHttpClient; 

import java.io.IOException; 

public class DataProvider { 

    String baseUri; 

    DataProvider() { 
     baseUri = "http://www.XXX.de/XXX/"; 
    } 

    public String requestUser(String userName) { 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpGet request = new HttpGet(baseUri + "get.php?userName=" + userName); 
     ResponseHandler<String> handler = new BasicResponseHandler(); 

     String result = ""; 

     try { 
      result = httpclient.execute(request, handler); 
     } catch (ClientProtocolException e) { 
      result = "ClientProtocolException was thrown"; 
     } catch (IOException e) { 
      result = "IOException was thrown"; 
     } 
     finally { 
      httpclient.getConnectionManager().shutdown(); 
     } 

     return result; 
    } 

} 

и в моей деятельности

public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_reload_package) { 
      String response = dataProvider.requestUser("BKDJSHDD-1912772-DIKDS-19172"); 
      browser.loadDataWithBaseURL("file:///android_asset/", response, "text/html", "UTF-8", "file:///android_asset/index.html"); 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

Щелкнув пункт меню вызывает приложение к сбою. Объекты browser и dataProvider на 100% правильно объявлены. Я тестирую приложение на своем устройстве, потому что мой компьютер работает слабым, чтобы запустить эмулятор, поэтому нет выхода на консоль.

Любые идеи? ..

+0

Проверьте конструктор DataProvider. Существует орфографическая ошибка – Msk

+2

«поэтому нет выхода на консоль» - вы можете получить в LogCat как с оборудования, так и с эмуляторов. Фактически, это тот же процесс. – CommonsWare

+0

Исходя из кода, предоставленного в настоящее время, похоже, что вы используете сетевой запрос в основном потоке. Вы не можете этого сделать (http://stackoverflow.com/q/6343166/390989). – eldarerathis

ответ

2

Мое первое впечатление это плохая декларация HTTP запроса. В Android, если вы хотите создать HttpRequest, вы должны поместить это в другой поток, а не в основной поток.

Ваш DataProvider.java ОК в терминах декларации и нулевых проверок, но не соответствует одному из стандартов безопасности Android android.os.NetworkOnMainThreadException.

Run Yout HTTP запрос с AsyncTask, что-то вроде этого в вашей деятельности:

// The other part of your code .... 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_reload_package) { 
     new DataProviderAsyncTask().execute(); 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

class DataProviderAsyncTask extends AsyncTask<String, Void, String> { 

    @Override 
    protected String doInBackground(String... params) { 
     String response = dataProvider 
       .requestUser("BKDJSHDD-1912772-DIKDS-19172"); 
     return response; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
     browser.loadDataWithBaseURL("file:///android_asset/", result, 
       "text/html", "UTF-8", "file:///android_asset/index.html"); 
    } 

} 

Я надеюсь, что вы служите

+0

Я полагаю, что это имеет какое-то отношение к потокам. Спасибо! –

+0

добро пожаловать @BarthZalewski – Cesardl

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