Java 单独线程中的对话框
我是线程方面的新手,所以这可能是一个很好的问题。。(: 我有一个线程在我的主活动的单独类中运行,这一切都很好,我能够使用Java 单独线程中的对话框,java,android,multithreading,Java,Android,Multithreading,我是线程方面的新手,所以这可能是一个很好的问题。。(: 我有一个线程在我的主活动的单独类中运行,这一切都很好,我能够使用handler.Post(new Runnable(){…从线程访问我的主活动的方法,这一切都很好,直到我尝试调用一个需要用户输入的对话框 这是对话框的方法: public boolean displayConfirm(String message, String positiveButton, String negativeButton, final displayConf
handler.Post(new Runnable(){…
从线程访问我的主活动的方法,这一切都很好,直到我尝试调用一个需要用户输入的对话框
这是对话框的方法:
public boolean displayConfirm(String message, String positiveButton, String negativeButton, final displayConfirmer onOnClick) {
AlertDialog.Builder builder = new AlertDialog.Builder(ISyncCRMActivity.this);
builder.setMessage(message);
builder.setCancelable(false);
builder.setPositiveButton(positiveButton, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface arg0, int arg1) {
onOnClick.onClick(true);
}
});
builder.setNegativeButton(negativeButton, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface arg0, int arg1) {
onOnClick.onClick(false);
}
});
AlertDialog dialog = builder.create();
dialog.show();
return bool;
}
private boolean bool;
public interface displayConfirmer {
public void onClick(boolean result);
}
正如您所见,您向它传递了一条对话框显示的消息和一条是、否按钮文本,然后它返回用户单击是(true
)或否(false
)的任何位置,我使用了一个界面来执行onClick()
。所有这些都允许我使用此代码来执行它
displayConfirm("Is this a dialog?", "Yes", "No", new ISyncCRMActivity.displayConfirmer() {
public void onClick(boolean result) {
// TODO Auto-generated method stub
Toast.makeText(ISyncCRMActivity.this, result ? "Yes" : "No", Toast.LENGTH_LONG).show();
}
});
这将一直等到用户单击“是”或“否”之后,才能继续使用代码,这正是我所需要的,但在另一个线程中
因此,在我的单独线程中,这是我正在做的:
handler.post(new Runnable() {
public void run() {
iSyncCRMActivity.displayConfirm("Is this a dialog?", "Yes", "No", new ISyncCRMActivity.displayConfirmer() {
public void onClick(boolean result) {
if (result) dialog = true;
else dialog = false;
}
});
}
});
if (dialog) {
//clicked yes
} else {
//clicked no
}
如您所见,我希望在UI线程上调用对话框,然后在单独的线程上处理响应
我怎么能做到这一点?这是可以做到的吗?!
任何帮助都将不胜感激
编辑:
这就是错误:
07-20 11:04:35.782: ERROR/global(16201): Deprecated Thread methods are not supported.
07-20 11:04:35.782: ERROR/global(16201): java.lang.UnsupportedOperationException
07-20 11:04:35.782: ERROR/global(16201): at java.lang.VMThread.stop(VMThread.java:85)
07-20 11:04:35.782: ERROR/global(16201): at java.lang.Thread.stop(Thread.java:1379)
07-20 11:04:35.782: ERROR/global(16201): at java.lang.Thread.stop(Thread.java:1344)
07-20 11:04:35.782: ERROR/global(16201): at com.millennium.isynccrm.Classes.TcpClient.disconnect(TcpClient.java:55)
07-20 11:04:35.782: ERROR/global(16201): at com.millennium.isynccrm.Classes.SyncClient.stopSync(SyncClient.java:73)
07-20 11:04:35.782: ERROR/global(16201): at com.millennium.isynccrm.Classes.SyncClient.recieveMessage(SyncClient.java:236)
07-20 11:04:35.782: ERROR/global(16201): at com.millennium.isynccrm.Classes.TcpClient$1.run(TcpClient.java:34)
07-20 11:04:35.782: ERROR/global(16201): [ 07-20 11:04:35.782 16201:0x3f54 F/dalvikvm ]
07-20 11:04:35.782: ERROR/global(16201): Exception!!! threadid=10: thread exiting with uncaught exception (group=0x4001d810)
07-20 11:04:35.812: ERROR/AndroidRuntime(16201): FATAL EXCEPTION: Thread-12
07-20 11:04:35.812: ERROR/AndroidRuntime(16201): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
07-20 11:04:35.812: ERROR/AndroidRuntime(16201): at android.view.ViewRoot.checkThread(ViewRoot.java:2806)
07-20 11:04:35.812: ERROR/AndroidRuntime(16201): at android.view.ViewRoot.requestLayout(ViewRoot.java:594)
07-20 11:04:35.812: ERROR/AndroidRuntime(16201): at android.view.View.requestLayout(View.java:8125)
07-20 11:04:35.812: ERROR/AndroidRuntime(16201): at android.view.View.requestLayout(View.java:8125)
07-20 11:04:35.812: ERROR/AndroidRuntime(16201): at android.view.View.requestLayout(View.java:8125)
07-20 11:04:35.812: ERROR/AndroidRuntime(16201): at android.view.View.requestLayout(View.java:8125)
07-20 11:04:35.812: ERROR/AndroidRuntime(16201): at android.view.View.requestLayout(View.java:8125)
07-20 11:04:35.812: ERROR/AndroidRuntime(16201): at android.widget.TextView.checkForRelayout(TextView.java:5378)
07-20 11:04:35.812: ERROR/AndroidRuntime(16201): at android.widget.TextView.setText(TextView.java:2688)
07-20 11:04:35.812: ERROR/AndroidRuntime(16201): at android.widget.TextView.setText(TextView.java:2556)
07-20 11:04:35.812: ERROR/AndroidRuntime(16201): at android.widget.TextView.setText(TextView.java:2531)
07-20 11:04:35.812: ERROR/AndroidRuntime(16201): at com.millennium.isynccrm.ISyncCRMActivity.updateCurentTask(ISyncCRMActivity.java:282)
07-20 11:04:35.812: ERROR/AndroidRuntime(16201): at com.millennium.isynccrm.Classes.SyncClient.stopSync(SyncClient.java:74)
07-20 11:04:35.812: ERROR/AndroidRuntime(16201): at com.millennium.isynccrm.Classes.SyncClient.recieveMessage(SyncClient.java:236)
07-20 11:04:35.812: ERROR/AndroidRuntime(16201): at com.millennium.isynccrm.Classes.TcpClient$1.run(TcpClient.java:34)
我相信您正在等待设置对话框布尔值,然后再继续编写下一行代码。有很多方法可以做到这一点,我建议您阅读Java并发教程。下面是一些快速解决方案,可以让事情顺利进行,但我不确定这是否是最好的,因为我不熟悉android开发。但是,我不知道想一想Android中对话框的要点是它们是异步的(为什么不在回调中放入下一步要发生的事情,而不是让另一个线程等待呢?)
一个新类,用于记录是否按下了yes(是)或no(否):
public class WaitingDialog implements Runnable {
volatile boolean finished;
volatile boolean dialog;
String message;
String button1;
String button2;
public WaitingThread(String message, String button1, String button2) {
this.button1 = button1;
this.button2 = button2;
this.message = message;
finished = false;
}
@Override
public void run() {
iSyncCRMActivity.displayConfirm(message, button1, button2, new ISyncCRMActivity.displayConfirmer() {
public void onClick(boolean result) {
if (result) dialog = true;
else dialog = false;
finished = true;
}
});
}
public boolean isFinished() {
return finished;
}
public boolean getDialog {
return dialog;
}
}
以及使用此新类的现有代码:
WaitingDialog waitingDialog = new WaitingDialog("Is this a dialog?", "Yes", "No");
handler.post(waitingDialog);
//Wait here for onclick to be called before you proceed
while(!waitingDialog.isFinished())
if (waitingDialog.getDialog()) {
//clicked yes
} else {
//clicked no
}
这段代码的目的很难理解。错误是什么?请稍微清理一下描述。线程的目的是什么?啊,对不起。线程的目的是从tcp连接检索线路,然后将联系人添加到通讯簿中,我试图做的是在线程上弹出一个对话框,然后等待用户已在对话框上单击“是”或“否”,然后继续代码。。