Android:为什么不同的AsyncTask有不同的TID?

时间:2015-10-16 18:48:00

标签: android android-asynctask

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

谢谢,

1 个答案:

答案 0 :(得分:3)

myTid()返回线程ID,而不是进程ID,如the documentation所述。两个并行AsyncTask个线程的线程ID将不同。

更新:就两个线程ID不同的原因而言,如果您查看the source code to AsyncTaskExecutorexecute()一起使用的是{{1} }} 默认情况下。这实际上不是单线程线程池,而是围绕我们通常与SerialExecutor一起使用的主多线程线程池(THREAD_POOL_EXECUTOR)的序列化包装器。该线程池在一开始就用几个线程初始化(核心数+ 1)。我的猜测是executeOnExecutor()只是将后续作业从循环中移到线程上,这会导致单独的线程ID。

考虑THREAD_POOL_EXECUTOR的更好方法是一次只运行一个execute(),不一定所有此类AsyncTask实例都将在同一个线程上运行。