在选择对话框选项之前可以停止线程吗?
It is possible to stop a thread until a dialog option has been chosed?
据我们所知,android 对话框只能在主 UI 线程下创建和显示。
问题是我有一个进度条,很多工作是在一个线程中完成的,在进度的某些部分我必须显示一个对话框,用户必须 select 一个选项来获取工作继续。
所以..我需要在线程中显示一个对话框(阻塞线程直到用户select编辑了一个选项)。
我用这段代码试过了
public void showDialog(Activity activity) {
Looper.prepare();
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(activity);
// set title
alertDialogBuilder.setTitle("");
// set dialog message
alertDialogBuilder
.setMessage(R.string.STREAM_NOT_WIFI)
.setCancelable(false)
.setPositiveButton(R.string.STREAM_NOT_WIFI_YES, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
preload=true;
}
})
.setNegativeButton(R.string.CANCEL, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
preload=false;
}
});
// create alert dialog
AlertDialog alertDialog = alertDialogBuilder.create();
// show it
alertDialog.show();
}
但我收到这条消息,但没有显示对话框:
"attempting to initialize hardware acceleration outside of the main thread, aborting"
您不能简单地调用 Looper.prepare()
并在 UI 线程上显示任何线程。您需要后台线程与 UI 线程进行交互,该线程有限制。
这是一个与此相关的很好的 SO 问题,但请务必阅读 3 或 4 个答案(不仅仅是第一个)并且问题本身是关于 Toast
- 忽略它。你遇到的问题类似...
Can't create handler inside thread that has not called Looper.prepare()
此外,您可以在此处查看有关此类问题的教程:
http://codetheory.in/android-handlers-runnables-loopers-messagequeue-handlerthread/
Activity
和 View
中有内置方法,您可以使用这些方法将 post 任务从非 UI 线程转换为 UI 线程-线。其中之一是 Activity
的 runOnUiThread
。
样本:
public class MainActivity extends Activity {
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Thread thread = new Thread(new Runnable() {
private final Object lock = new Object();
private volatile boolean isEnabled = true;
@Override public void run() {
while (isEnabled) {
try {
Log.e("sample", "working...");
Thread.sleep(5000);
} catch (InterruptedException e) {
//
}
runOnUiThread(new Runnable() {
@Override public void run() {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setPositiveButton("Continue", new DialogInterface.OnClickListener() {
@Override public void onClick(DialogInterface dialog, int which) {
synchronized (lock) {
lock.notify();
}
}
});
builder.show();
}
});
synchronized (lock) {
try {
Log.e("sample", "work stopped. Waiting for dialog click.");
lock.wait();
} catch (InterruptedException e) {
//
}
}
}
}
});
thread.start();
}
}
示例看起来很乱,但它显示了来自非 UI 线程的 运行 任务的基础知识。 Activity
启动 Thread
,其中 "works" 持续 5 秒,然后要求用户继续。当用户点击对话框的按钮时,线程会继续执行工作。
据我们所知,android 对话框只能在主 UI 线程下创建和显示。
问题是我有一个进度条,很多工作是在一个线程中完成的,在进度的某些部分我必须显示一个对话框,用户必须 select 一个选项来获取工作继续。
所以..我需要在线程中显示一个对话框(阻塞线程直到用户select编辑了一个选项)。
我用这段代码试过了
public void showDialog(Activity activity) {
Looper.prepare();
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(activity);
// set title
alertDialogBuilder.setTitle("");
// set dialog message
alertDialogBuilder
.setMessage(R.string.STREAM_NOT_WIFI)
.setCancelable(false)
.setPositiveButton(R.string.STREAM_NOT_WIFI_YES, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
preload=true;
}
})
.setNegativeButton(R.string.CANCEL, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
preload=false;
}
});
// create alert dialog
AlertDialog alertDialog = alertDialogBuilder.create();
// show it
alertDialog.show();
}
但我收到这条消息,但没有显示对话框:
"attempting to initialize hardware acceleration outside of the main thread, aborting"
您不能简单地调用 Looper.prepare()
并在 UI 线程上显示任何线程。您需要后台线程与 UI 线程进行交互,该线程有限制。
这是一个与此相关的很好的 SO 问题,但请务必阅读 3 或 4 个答案(不仅仅是第一个)并且问题本身是关于 Toast
- 忽略它。你遇到的问题类似...
Can't create handler inside thread that has not called Looper.prepare()
此外,您可以在此处查看有关此类问题的教程:
http://codetheory.in/android-handlers-runnables-loopers-messagequeue-handlerthread/
Activity
和 View
中有内置方法,您可以使用这些方法将 post 任务从非 UI 线程转换为 UI 线程-线。其中之一是 Activity
的 runOnUiThread
。
样本:
public class MainActivity extends Activity {
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Thread thread = new Thread(new Runnable() {
private final Object lock = new Object();
private volatile boolean isEnabled = true;
@Override public void run() {
while (isEnabled) {
try {
Log.e("sample", "working...");
Thread.sleep(5000);
} catch (InterruptedException e) {
//
}
runOnUiThread(new Runnable() {
@Override public void run() {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setPositiveButton("Continue", new DialogInterface.OnClickListener() {
@Override public void onClick(DialogInterface dialog, int which) {
synchronized (lock) {
lock.notify();
}
}
});
builder.show();
}
});
synchronized (lock) {
try {
Log.e("sample", "work stopped. Waiting for dialog click.");
lock.wait();
} catch (InterruptedException e) {
//
}
}
}
}
});
thread.start();
}
}
示例看起来很乱,但它显示了来自非 UI 线程的 运行 任务的基础知识。 Activity
启动 Thread
,其中 "works" 持续 5 秒,然后要求用户继续。当用户点击对话框的按钮时,线程会继续执行工作。