2013-09-08 2 views
1

Я новичок в разработке Android. В рамках более крупного проекта я хочу вставить данные с устройства android на веб-сервер. Поэтому я сделал некоторые исследования и статьи, такие как The article from androidhive и this article from codeproject, были очень полезны при разработке тестового приложения, которое вставляется в базу данных mysql db, которая находится на удаленном веб-сервере.Вставка в mysql из приложения для Android

Вот мой андроид код

ConnectivityManager connMgr = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); 
    if (networkInfo != null && networkInfo.isConnected()){ 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost("http://xxxxxxxx.in/installment.php"); 
     try{ 
      List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
      nameValuePairs.add(new BasicNameValuePair("name", editTextCustomer.getText().toString())); 
      nameValuePairs.add(new BasicNameValuePair("amount", editTextAmount.getText().toString())); 

      httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
      HttpResponse response = httpclient.execute(httppost); 

      HttpEntity entity = response.getEntity(); 
      InputStream is = entity.getContent(); 
      Log.i("postData", response.getStatusLine().toString()); 
     }catch(Exception e){ 
      Log.e("log_tag", "Error in http connection"+e.toString()); 
     } 
    } 
    else { 
     Toast.makeText(PayBillActivity.this, "Internet Access, Denied!!", Toast.LENGTH_LONG).show(); 
    } 

Вот PHP код

<?php 

/* 
* Following code will create a new product row 
* All product details are read from HTTP Post Request 
*/ 

// array for JSON response 
$response = array(); 

// check for required fields 
if (isset($_POST['name']) && isset($_POST['amount'])) { 

    $name = $_POST['name']; 
    $amount = $_POST['amount']; 

    $con=mysqli_connect("localhost","db_user","passwd","db_name"); 

    // Check connection 
if (mysqli_connect_errno()) 
    { 
    echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
    } 

$sql="INSERT INTO installment (name, amount) VALUES ('$_POST[name]','$_POST[amount]')"; 

if (!mysqli_query($con,$sql)) 
    { 
    die('Error: ' . mysqli_error($con)); 
    } 
echo "1 record added"; 

    // check if row inserted or not 
    if ($sql) { 
     // successfully inserted into database 
     $response["success"] = 1; 
     $response["message"] = "Installment made successfully"; 

     // echoing JSON response 
     echo json_encode($response); 
    } else { 
     // failed to insert row 
     echo $result; 
     $response["success"] = 0; 
     $response["message"] = "Oops! An error occurred."; 

     // echoing JSON response 
     echo json_encode($response); 
    } 
} else { 
    // required field is missing 
    //$amount = 1000; 
    //echo $amount; 
    $response["success"] = 0; 
    $response["message"] = "Required field(s) is missing"; 

    // echoing JSON response 
    echo json_encode($response); 
} 
?> 

при запуске приложения, я получаю этот «NetworkOnMainThreadException» исключение, и в результате ни одна строка не является добавлено. Но его работа отлично работает с HTML POST.

Может ли кто-нибудь сказать мне, где проблема в моем коде? Заранее спасибо! :)

+1

Android не позволяет/сильно отговаривают вас от этого сеть связанных процессов в главном потоке. Связанные с сетью процессы могут задерживать приложение в течение длительного времени, если выполняются в основном потоке. Рекомендуется, чтобы вы ввели такие процессы в асинхронный поток. – Razgriz

+0

Если вы поместите «NetworkOnMainThreadException» в поле поиска на этом сайте, вы получите 342 результата. Это должно помочь вам – NickT

ответ

2

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

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

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder(). AllowAll(). Build();

StrictMode.setThreadPolicy (политика);

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

0

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

Просто используйте смарт Premade LIB и делает все для вас!

Скачать: http://loopj.com/android-async-http/

Примечание: И это Lib даже с помощью GZIP, чтобы сжать запросы :)