A将在当前线程中Handler
默认执行代码/处理消息(任何没有Looper
eg的构造函数)。new Handler()
在几乎所有情况下,这都是主线程。如果您希望它在不同的线程中执行,您必须告诉它Looper
应该使用哪个线程。
Android 有一个名为的实用程序类HandlerThread
,它创建一个Thread
带有Looper
.
简短的例子:
public class MyActivity extends Activity {
private Handler mHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
HandlerThread handlerThread = new HandlerThread("background-handler");
handlerThread.start();
Looper looper = handlerThread.getLooper();
mHandler = new Handler(looper);
mHandler.post(new Runnable() {
public void run() {
// code executed in handlerThread
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
// stops the HandlerThread
mHandler.getLooper().quit();
}
}
如果您的任务只需要一些信息并且不需要报告,我会选择IntentService
. 如果您的活动生命周期重新创建活动,这些不会发疯。
Service
你会在它自己的文件中创建一个小文件
public class SaveService extends IntentService {
public SaveService() {
super("SaveService");
}
@Override
protected void onHandleIntent(Intent intent) {
if ("com.example.action.SAVE".equals(intent.getAction())) {
String player = intent.getStringExtra("com.example.player");
int score = intent.getIntExtra("com.example.score", -1);
magicHttpSave(player, score); // assuming there is an implementation here
}
}
}
将其添加到AndroidManifest.xml
<application ....
<service android:name=".SaveService" />
</application>
并在您的代码中以
Intent intent = new Intent(this /* context */, SaveService.class);
intent.setAction("com.example.action.SAVE");
intent.putExtra("com.example.player", "John123");
intent.putExtra("com.example.score", 5123);
startService(intent);
IntentService#onHandleIntent()
已经在后台线程上运行,因此您不必为此烦恼。