我Activity
通过调用Class
生成2个相同的AsyncTask
new SomeTask().execute();
new SomeTask().execute();
:
android.os.Process.myTid()
调试时 - 从doInBackground
调用TID
我为每个人AsyncTask
获得不同的Thread
。这意味着每个<?php
include_once "db.php";
$username = $_POST['user'];
$password = $_POST['pass'];
echo "Username: ";
echo $username;
echo "<br>";
echo "Password: ";echo $password;
echo "<br>";
function GetPassword() {
$db = getDataBase();
$stmt = $db->prepare('SELECT username,password FROM userinfo WHERE username = :user AND password = :pass');
$stmt->bindParam(':user',$username, PDO::PARAM_STR);
$stmt->bindParam(':pass', $password, PDO::PARAM_STR);
$stmt->execute();
$results = $stmt->fetch(PDO::FETCH_ASSOC);
foreach( $results as $row ){
print_r( $row );
}
return $results;
}
$realpw = GetPassword();
if($password == $realpw[0])
{
echo "Logged in";
json_encode($usernameInput);
echo $realpw[0];
}else
{
echo "invalid username or password";
}
?>
正在不同的ItemsControl
上执行。
但这似乎与docs的说法相矛盾:
从HONEYCOMB开始,任务 s 在单个线程上执行......
这里有什么解释?
目标API:23
跑步:22
Min API:15
编译:23
谢谢,
答案 0 :(得分:3)
myTid()
返回线程ID,而不是进程ID,如the documentation所述。两个并行AsyncTask
个线程的线程ID将不同。
更新:就两个线程ID不同的原因而言,如果您查看the source code to AsyncTask
,Executor
与execute()
一起使用的是{{1} }} 默认情况下。这实际上不是单线程线程池,而是围绕我们通常与SerialExecutor
一起使用的主多线程线程池(THREAD_POOL_EXECUTOR
)的序列化包装器。该线程池在一开始就用几个线程初始化(核心数+ 1)。我的猜测是executeOnExecutor()
只是将后续作业从循环中移到线程上,这会导致单独的线程ID。
考虑THREAD_POOL_EXECUTOR
的更好方法是一次只运行一个execute()
,不一定所有此类AsyncTask
实例都将在同一个线程上运行。