好吧,请不要问我为什么,但我需要开始同步和阻止活动,以便程序流程不会继续,直到它完成。我知道如何进行同步Dialog,但我该如何进行同步活动?
以下是我尝试但失败的两种方法:
// In the 1st activity, start the 2nd activity in the usual way
startActivity(intent);
Looper.loop(); // but pause the program here
// Program continuse running afer Looper.loop() returns
....
// Then, in the second activity's onBackPressed method:
public void onBackPressed() {
// I was hoping the following quit() will terminate the loop() call in
// the first activity. But it caused an exception "Main thread not allowed
// to quit." Understandable.
new Hanlder().getLooper().quit();
}
我还尝试使用另一个线程来实现这个目标:
// In the first activity, start a thread
SecondThread m2ndThread = new SecondThread(this);
Thread th = new Thread(m2ndThread, "Second Thread");
th.run();
synchronized(m2ndThread) {
m2ndThread.wait();
}
class SecondThread implements Runnable {
Activity m1stActivity;
SecondThread(Activity a) {
m1stActivity = a;
}
public void run() {
Looper.prepare();
Handler h = new Handler() {
public void handleMessage() {
Intent intent = new Intent(m1stActivity, SecondActivity.class);
m1stActivity.startActivity(intent); // !!!!!!!!!!!!!!
}
}
h.sendEmptyMessage(10); // let it run
Looper.quit();
}
}
然而,这种方法不起作用,因为当我使用第一个活动开始第二个活动时,主线程已经处于等待状态并且什么都不做。所以第二项活动甚至没有创造出来。 (这很讽刺:你必须使用一项活动开始一项活动,但是当它已经处于等待状态时你怎么能这样做呢?)
答案 0 :(得分:9)
你不能。
这就是它的全部。你不能这样做。活动始终在主线程上执行。您的主线程必须主动运行其事件循环。它总是被破坏以阻止主线程的事件循环。总是
答案 1 :(得分:2)
所有活动都是异步的。但是,如果要阻止应用程序流的其余部分直到活动完成,则可以对活动设置的标志注入依赖项。最常用的封装方式是将标志与intent / activity / return流一起携带。你可以:
在该对象的全局范围内声明该标志:
boolean syncBlock = false;
int ASYNC_ACTIVITY_REQUEST_CODE = 1; // Arbitrary unique int
在对象的范围内,启动新活动包括:
Intent asyncIntent = new Intent(this, AsyncActivity.class);
syncBlock = true;
startActivityForResult(asyncIntent, ASYNC_ACTIVITY_REQUEST_CODE);
while(syncBlock) {}
在开始活动的对象中:
onActivityResult(int requestCode, int resultCode, Intent data)
{
switch(requestCode)
{
case ASYNC_ACTIVITY_REQUEST_CODE:
{
syncBlock = false;
break;
}
[...]
}
这是一个粗暴的黑客攻击,如果你在你的UI线程中阻塞(例如在你的MAIN活动中),你就会阻止所有内容,包括你的用户可能希望响应但不会响应的其他UI功能。这是一个很大的诺,你应该学会使用异步流程,使应用程序以Android方式运行。但如果你绝对必须......