1

私はアンドロイド開発が初めてです。より大きなプロジェクトの一環として、Android デバイスから Web サーバーにデータを挿入したいと考えています。そこで、androidhive の記事や codeproject のこの記事のような調査と記事を行いまし。これは、リモート Web サーバーにある mysql db に挿入するテストアプリを開発するのに非常に役立ちました。

ここに私のアンドロイドコードがあります

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 で完璧に動作します。

私のコードのどこに問題があるか教えてもらえますか? 前もって感謝します!:)

4

2 に答える 2

2

この質問をGoogleに投稿するのに時間を費やしたなら、良い答えが得られるかもしれません...この質問を完了するだけです

コード行を追加してメイン スレッドでのネットワーク操作を許可するという 2 つのオプションを利用できますが、これはアプリにとって、またコーディング スタイルとしても非常によくありません。

StrictMode.ThreadPolicy ポリシー = 新しい StrictMode.ThreadPolicy.Builder().permitAll().build();

StrictMode.setThreadPolicy(ポリシー);

より長いオプションは、ネットワーク操作を別のスレッドで実行するようにコードを再設計することです。これはアプリにとっても良いことであり、マルチスレッド プログラムでの作業方法を学ぶことができます。

于 2013-09-08T16:32:46.480 に答える
0

その厳密を使用したり、メインから手動で取り出したりするべきではないと思います..

スマートな既製のライブラリを使用するだけで、すべてが作成されます!

ダウンロード: http: //loopj.com/android-async-http/

注:そして、このライブラリはgzipを使用してリクエストを圧縮しています:)

于 2013-09-08T17:39:41.773 に答える