gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:59:37 25 4
gpt4 key购买 nike

我有这个 Android 程序,它以这种方式在 Web DB (MySQL) 上写入数据:AndroidApp -> HTTP GET -> PHP -> MySQL DB。在应用程序方面,我使用一个 AsyncTask 来读取表单并生成 URL HTTP,以便在我单击“保存”按钮时发送到 Web 服务器。

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

我不明白为什么第二次会发生这种情况。任何帮助表示赞赏。 :)

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

PS:Web 客户端(HTTP GET、PHP 和 MySQL)都工作正常。问题只是在客户端 Android 上:(

Activity 代码:

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();
}
}

异步任务代码:

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);
}
}

最佳答案

这是从 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);

?>

关于php - 为什么当我尝试在 Web 服务器上写入一些数据时 AsyncTask 运行两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24664241/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com