当我尝试在Web服务器上写一些数据时,为什么AsyncTask会运行两次?

时间:2014-07-09 21:41:05

标签: php android mysql android-asynctask

我有这个Android程序以这种方式在Web DB(MySQL)上写入​​数据:AndroidApp - > HTTP GET - > PHP - > MySQL DB。在App端,我使用一个AsyncTask来读取表单并生成URL HTTP以便在我点击" Save"按钮。

问题在于:当我点击"保存"第一次按钮,应用程序工作正常。但是当我尝试在数据库中插入一个新值时,新值正确写入,但第二个线程(如幽灵)重写旧值。 所以在我的DB中我现在有:
-DATA1< - 第一次插入
-DATA2< - 第二次插入
-DATA1< - 也是第二次插入(这是错误的!)

我无法理解为什么会在第二次发生这种情况。 任何帮助表示赞赏。 :)

第一次只运行一个AsyncTask,但第二次AsyncTask工作两次(写入新数据和旧数据)。

PS:Web客户端(HTTP GET,PHP和MySQL)都运行良好。问题出在客户端Android上:(

活动代码:

public class MainActivity extends Activity {

    AsyncTask<String, Void, String> task;
    EditText id_location;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);     
    }

    public void startButton(View view){
        id_location = (EditText)findViewById( R.id.editText1);
         task = new AsyncTaskd(this,id_location.getText().toString());
         task.execute(); 
    }
}

AsyncTask代码:

public class AsyncTaskd  extends AsyncTask<String,Void,String>{

    String string;
    Context context;

   public AsyncTaskd(Context context, String string) {
       this.string = string; 
       this.context = context;
   }

   protected void onPreExecute(){

   }

   @Override
   protected String doInBackground(String... arg0) {

       android.os.Debug.waitForDebugger();

       try{
             String link = "http://xxx.xxx.xxx/access.php?type_connection=insert"+
             "&id_location="+string;
             Log.w("DEBUG", "'"+string+"'");
             HttpClient client = new DefaultHttpClient();
             HttpGet request = new HttpGet();
             request.setURI(new URI(link));
             HttpResponse response = client.execute(request);
             BufferedReader in = new BufferedReader
            (new InputStreamReader(response.getEntity().getContent()));

            StringBuffer sb = new StringBuffer("");
            String line=""; 
            while ((line = in.readLine()) != null) {
               sb.append(line);
               break;
             }
             in.close();
             return sb.toString();
           }catch(Exception e){
              return new String("Exception: " + e.getMessage());
           }
       }


   @Override
   protected void onPostExecute(String result){
    System.out.println("Insert "+ result );
    Toast toast = Toast.makeText(context, result, Toast.LENGTH_SHORT);
    toast.show();
    this.cancel(true); 
   }
}

2 个答案:

答案 0 :(得分:0)

这是通过URL HTTP在数据库中插入数据的PHP代码:

<?php

//Credenziali accesso da php:
$mysql_host = "host";
$mysql_database = "database";
$mysql_user = "user";
$mysql_password = "password";

//connect to DB
$con=mysqli_connect($mysql_host,$mysql_user,$mysql_password,$mysql_database);

//Type connection definition
$type_connection = $_GET['type_connection'];


/////////////////////
//Connect for INSERT
if($type_connection == "insert"){
    if (mysqli_connect_errno($con))
    {
       echo "Failed to connect to MySQL: " . mysqli_connect_error();
    }


    $id_location = $_GET['id_location'];


    $string="INSERT INTO `database`.`table` ( `id_location` ) VALUES ( '".$id_location."' );";

    mysqli_query($con,$string);


    echo "DONE INSERT!"; 

}

//Disconnect from DB
mysqli_close($con);

?>  

答案 1 :(得分:0)

我解决了我的问题。 在调试期间,我使用的是模拟器,但它必须与AsyncTask有一些问题。坚持,当我尝试使用我的电话时,我的应用程序一直很愉快地工作,我想要向我的数据库添加新数据。没有更多的重复。

感谢Greenapps的帮助, 再见