Вылетает приложение Android по Http-запросу на подключение к онлайн-базе

1

Я новичок в Android, и мне нужно подключить мое приложение к онлайн-базе данных. Я создал базу данных и файлы подключения php. Я также создал тестовый файл index.php, чтобы проверить соединение:

index.php

<?php
include_once 'connection.php';
echo 'hi';
?>

Я также использовал search.php для получения данных:

 <?php


     mysql_connect("localhost","****","*****");
      mysql_select_db("*****");
      $sql=mysql_query("select * from user where username like 'a%'");
      while($row=mysql_fetch_assoc($sql)) $output[]=$row;
      print(json_encode($output));
      mysql_close();

      ?>

Это результат поиска search.php:

[{"id":"2","username":"adla","password":"123","type":null,"customer_id":null,"employee_id":null}]

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

Я попробовал два метода из 2 учебников:

  1. http://www.helloandroid.com/tutorials/connecting-mysql-database (Использование метода Post)

        public void connectNow(View view)
        {
    
    
        String result = null;
        InputStream is = null;
        StringBuilder sb =null;
    
        ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
        //http post
        try{
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost("http://akmiengineering.com/insurance-app/search.php");
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            HttpResponse response = httpclient.execute(httppost);
            HttpEntity entity = response.getEntity();
            is = entity.getContent();
    
            Toast.makeText(getApplicationContext(),"Connection successful!! This is return:" +is , Toast.LENGTH_LONG).show();
    
        }catch(Exception e){
            Log.e("log_tag", "Error in http connection" + e.toString());
    
    
        }
    
        //convert response to string
        try{
            BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
            sb = new StringBuilder();
            sb.append(reader.readLine() + "\n");
            String line="0";
    
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
    
            is.close();
            result=sb.toString();
            Toast.makeText(getApplicationContext(),"Connection successful!! This is result:" +result , Toast.LENGTH_LONG).show();
    
        }catch(Exception e){
            Log.e("log_tag", "Error converting result "+e.toString());
        }
    
        //paring data
        String fd_id;
        String fd_name;
       try{
            jArray = new JSONArray(result);
            JSONObject json_data=null;
    
            for(int i=0;i<jArray.length();i++) {
                json_data = jArray.getJSONObject(i);
               fd_id = json_data.getString("username");
                fd_name = json_data.getString("password");
                Toast.makeText(getApplicationContext(), "I'm here!! This is name:" + fd_id + " and this is pass: " + fd_name, Toast.LENGTH_LONG).show();
            }
    
       }catch(JSONException e1){
          Toast.makeText(getBaseContext(), "No Data Found", Toast.LENGTH_LONG).show();
        }
    
    
    
    }
    

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

            HttpResponse response = httpclient.execute(httppost);
  1. http://hmkcode.com/android-internet-connection-using-http-get-httpclient/ (с использованием GET)

        protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_http_test);
        EditText etResponse;
        TextView tvIsConnected;
    
            // get reference to the views
            etResponse = (EditText) findViewById(R.id.etResponse);
            tvIsConnected = (TextView) findViewById(R.id.tvIsConnected);
    
            // check if you are connected or not
            if(isConnected()){
                tvIsConnected.setBackgroundColor(0xFF00CC00);
                tvIsConnected.setText("You are conncted");
            }
            else{
                tvIsConnected.setText("You are NOT conncted");
            }
    
            // show response on the EditText etResponse
            etResponse.setText(GET("http://akmiengineering.com/insurance-app/index.php"));
    
        }
    
    public static String GET(String url){
        InputStream inputStream = null;
        String result = "";
        try {
    
            // create HttpClient
            HttpClient httpclient = new DefaultHttpClient();
    
            // make GET request to the given URL
            HttpResponse httpResponse = httpclient.execute(new HttpGet(url));
    
            // receive response as inputStream
            inputStream = httpResponse.getEntity().getContent();
    
            // convert inputstream to string
            if(inputStream != null)
                result = convertInputStreamToString(inputStream);
            else
                result = "Did not work!";
    
        } catch (Exception e) {
            Log.d("InputStream", e.getLocalizedMessage());
        }
    
        return result;
    }
    
    // convert inputstream to String
    private static String convertInputStreamToString(InputStream inputStream) throws IOException {
        BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(inputStream));
        String line = "";
        String result = "";
        while((line = bufferedReader.readLine()) != null)
            result += line;
    
        inputStream.close();
        return result;
    
    }
    
    // check network connection
    public boolean isConnected(){
        ConnectivityManager connMgr = (ConnectivityManager) getSystemService(this.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
        if (networkInfo != null && networkInfo.isConnected())
            return true;
        else
            return false;
    }
    

Кроме того, этот код приводит к сбою приложения в этот момент:

  HttpResponse httpResponse = httpclient.execute(new HttpGet(url));

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

07-08 15:08:06.631    2750-2750/com.bluestacks.gamepophome E/bluestacksHome﹕ Hidden apps list thru binder[com.zqgame.fr.en.androidgp, com.igg.bzbee.slotsdeluxe, com.igg.clashoflords2, com.igg.pokerdeluxe, air.com.sublinet.tastytale]
07-08 15:08:06.641    2750-2750/com.bluestacks.gamepophome E/bluestacksHome﹕ Hidden list size 5
07-08 15:08:06.731    2661-2673/com.android.inputmethod.latin W/Binder﹕ Caught a RuntimeException from the binder stub implementation.
    java.lang.NullPointerException
            at android.inputmethodservice.IInputMethodWrapper.setSessionEnabled(IInputMethodWrapper.java:280)
            at com.android.internal.view.IInputMethod$Stub.onTransact(IInputMethod.java:129)
            at android.os.Binder.execTransact(Binder.java:404)
            at dalvik.system.NativeStart.run(Native Method)
07-08 15:08:06.731   2533-29585/system_process W/InputMethodManagerService﹕ Got RemoteException sending setActive(false) notification to pid 7192 uid 10066

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

Теги:
post
httprequest
get

2 ответа

1
Лучший ответ

Я думаю, что вы можете столкнуться с проблемой потоковой передачи в Android. Обычно такие методы, как ваш метод GET, должны находиться внутри другого класса, который расширяет AsyncTask, который будет запускать ваш код в другом потоке, отличном от основного.

Если вы не хотите использовать AsyncTask и хотите заставить ваш код запускать все в одном потоке, вы должны иметь что-то вроде этого внутри метода onCreate:

if (android.os.Build.VERSION.SDK_INT > 9) {
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);
}
  • 0
    Спасибо!! Это сработало!!
  • 0
    Я рад :) Имейте в виду, что расширение AsyncTask является лучшим способом в этих случаях, если условие, которое я разместил, должно рассматриваться как временное решение
Показать ещё 1 комментарий
0

Вы объявили интернет-разрешение в файле манифеста.

  • 0
    Да, у меня есть: <использует-разрешение android: name = "android.permission.INTERNET" /> <использует-разрешение android: name = "android.permission.ACCESS_NETWORK_STATE" />

Ещё вопросы

Сообщество Overcoder
Наверх
Меню