2012-10-24 5 views
-1

Я новичок в android, и мне бы хотелось создать приложение, которое считывает данные с сервера mysql. I've taken from web an example about this, но я не могу заставить его работатьAndroid-соединение с mysql через php

Я использую eclipse для этого и для другой части php и mysql. Прежде всего, здесь мой скрипт, который работает нормально (city.php):

<?php 
//connecting to database 
$sql=mysql_query("select * from city"); 
$output = array(); 
while(list($id,$name)=mysql_fetch_array($sql)){ 
    $output[$id]=$name; 

} 
print(json_encode($output)); 
mysql_free_result($sql); 

?> 

Это возвращается:

{"1":"Brasov","2":"Bucuresti"} 

На моем андроида проекте от затмения, у меня есть в MainActivity.java :

package com.example.mycity; 


import android.os.Bundle; 
import android.app.Activity; 


import java.io.BufferedReader; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.util.ArrayList; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.NameValuePair; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.entity.UrlEncodedFormEntity; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import android.net.ParseException; 
import android.util.Log; 
import android.widget.Toast; 

public class MainActivity extends Activity { 

JSONArray jArray; 
String result = null; 
InputStream is = null; 
StringBuilder sb=null; 

@Override 
public void onCreate(Bundle savedInstanceState) { 


super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_main); 

ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
//http post 
try{ 
    HttpClient httpclient = new DefaultHttpClient(); 
    HttpPost httppost = new HttpPost("http://www.steagu.ro/android/city.php"); 
    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
    HttpResponse response = httpclient.execute(httppost); 
    if (response.getStatusLine().getStatusCode() != 200) { 
      Log.d("MyApp", "Server encountered an error."); 

    } 
    HttpEntity entity = response.getEntity(); 
    is = entity.getContent(); 
    }catch(Exception e){ 
     //e.printStackTrace(); 
     Log.e("log_tag", "Error in http connection: "+e.toString()); 
    } 

    } 


} 

Но когда я бегу это, я получаю сообщение об ошибке на LogCat: это не подключая к файлу: ошибка в связи с HTTP: android.os.NetworkOnMainThreadExce ption

10-24 13:04:34.429: I/dalvikvm(982): threadid=3: reacting to signal 3 
10-24 13:04:34.649: I/dalvikvm(982): Wrote stack traces to '/data/anr/traces.txt' 
10-24 13:04:34.859: E/log_tag(982): Error in http connection: android.os.NetworkOnMainThreadException 
10-24 13:04:34.919: I/dalvikvm(982): threadid=3: reacting to signal 3 
10-24 13:04:34.949: I/dalvikvm(982): Wrote stack traces to '/data/anr/traces.txt' 
10-24 13:04:35.151: D/gralloc_goldfish(982): Emulator without GPU emulation detected. 
10-24 13:04:35.479: I/dalvikvm(982): threadid=3: reacting to signal 3 
10-24 13:04:35.499: I/dalvikvm(982): Wrote stack traces to '/data/anr/traces.txt' 

У меня есть разрешение на интернет в AndroidManifest.xml:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.mycity" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="15" /> 
<uses-permission android:name="android.permission.INTERNET"></uses-permission> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name=".MainActivity" 
      android:label="@string/title_activity_main" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

Я не знаю, где проблема. Может ли кто-нибудь помочь мне в этом? Спасибо!

+0

Вы проверили, что ваш интернет работает в вашем эмуляторе? – Antarix

+0

Привет Антарикс, да, интернет-соединение прекрасно работает в эмуляторе. –

ответ

0

Вы можете использовать класс AsyncTask для выполнения сетевых операций, как StrictMode не позволяет сделать на главном примере пользовательского интерфейса следующим образом

  public class MainActivity extends Activity { 

     JSONArray jArray; 
     String result = null; 
     InputStream is = null; 
      StringBuilder sb=null; 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 


     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     new httpRequest().execute(); 

     } 


     private class httprRequest extends AsyncTask<String, Integer, String>{ 

       @override 
       public String doInBackground(String.... params){ 
        ArrayList<NameValuePair> nameValuePairs = new    ArrayList<NameValuePair>(); 
     //http post 
      try{ 
      HttpClient httpclient = new DefaultHttpClient(); 
      HttpPost httppost = new HttpPost("http://www.steagu.ro/android/city.php"); 
      httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
      HttpResponse response = httpclient.execute(httppost); 
      if (response.getStatusLine().getStatusCode() != 200) { 
       Log.d("MyApp", "Server encountered an error."); 

       } 
      HttpEntity entity = response.getEntity(); 
      is = entity.getContent(); 
      }catch(Exception e){ 
      //e.printStackTrace(); 
      Log.e("log_tag", "Error in http connection: "+e.toString()); 
      } 

       } 
       } 

      } 
     } 
+0

Спасибо, это сработало! Но теперь у меня проблемы с получением информации ... –

+0

, чтобы исправить новую ошибку, полученную вашим приемом, измените эту строку в методе onCreate. new httpRequest(). execute(); - result = new httpRequest(). Execute(). Get; Это должно исправить ваши ошибки, дайте мне знать в другом комментарии или новый вопрос. :) – kabuto178

+0

Thnak вы, это работает! Но это должно быть включено в try-catch, потому что в противном случае возникает ошибка.поэтому код выглядит следующим образом: try { result = new httprRequest(). execute(). get(); } catch (исключение e) {} int ct_id = 0; Строка ct_name = ""; // ждать, чтобы иметь данные внутри переменной время (результат == NULL) { \t Toast.makeText (getBaseContext(), "Подключение ...", Toast.LENGTH_LONG) .show(); \t} –

0

Проблема заключается в следующем:

10-24 13:04:34.859: E/log_tag(982): Error in http connection: 
        android.os.NetworkOnMainThreadException 

Вы должны сделать свой доступ к сети на другом потоке.

-1

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

Вот код:

package com.example.mycity; 


import android.os.AsyncTask; 
import android.os.Bundle; 
import android.app.Activity; 


import java.io.BufferedReader; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.util.ArrayList; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.NameValuePair; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.entity.UrlEncodedFormEntity; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import android.net.ParseException; 
import android.util.Log; 
import android.widget.TextView; 
import android.widget.Toast; 

public class MainActivity extends Activity { 

String result = ""; 
InputStream is = null; 
StringBuilder sb=null; 
//String ct_name = null; 

@Override 
public void onCreate(Bundle savedInstanceState) { 


super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_main); 
new httprRequest().execute(); 


int ct_id=0; 
String ct_name=""; 

//Toast.makeText(getBaseContext(), "This is "+result, 3000).show(); 

try { 
Thread.sleep(1000L); 
} catch (Exception te) {} 

try{ 
    //ct_name = result; 
    JSONArray jArray = new JSONArray(result); 

    for(int i=0;i<jArray.length();i++){ 
      JSONObject json_data= jArray.getJSONObject(i); 
      ct_id=json_data.getInt("CITY_ID"); 
      ct_name += json_data.getString("CITY_NAME")+":"; 
     } 

    } 
    catch(JSONException e1){ 
     e1.printStackTrace(); 
    } catch (ParseException e1) { 
      e1.printStackTrace(); 
    } 

TextView tv1 = (TextView) findViewById(R.id.textView1); 
tv1.setText(ct_name); 

} 

private class httprRequest extends AsyncTask<String, Integer, String>{ 

    @Override 
    public String doInBackground(String... params){ 
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
//http post 
try{ 
HttpClient httpclient = new DefaultHttpClient(); 
HttpPost httppost = new HttpPost("http://www.steagu.ro/android/city.php"); 
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
HttpResponse response = httpclient.execute(httppost); 
if (response.getStatusLine().getStatusCode() != 200) { 
    Log.d("MyApp", "Server encountered an error."); 

    } 
HttpEntity entity = response.getEntity(); 
is = entity.getContent(); 
}catch(Exception e){ 
//e.printStackTrace(); 
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(); 
}catch(Exception e){ 
     //Toast.makeText(getBaseContext(), "Am eroare aici", 3000).show(); 
     Log.e("log_tag", "Error converting result "+e.toString()); 
} 


/* 
Toast.makeText(getBaseContext(), "Here i am", 3000).show(); 
*/ 

return result; 
    } 

    } 

} 

я должен изменить немного кода, потому что я поставьте thread.sleep. Вместо этого я должен проверить, есть ли значение в результате (в цикле while). Я думаю, что это происходит, потому что в тот момент, когда я пытаюсь проанализировать значение, я не имею значение в результате.

Код РНР:

<?php 
//connecting to database 
$sql=mysql_query("select * from city where CITY_NAME like '%'"); 
$output = array(); 
while($row=mysql_fetch_assoc($sql)){ 
    $output[]=$row; 
} 

echo json_encode($output); 
mysql_free_result($sql); 

?> 

Таблица 'город' имеет две колонки, CITY_ID и city_name.

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