Java LibGDX SwingWorker冻结GUI(块上传程序)
我目前正在开发一个区块上传器(Java)来将文件上传到私有服务器。一切都很完美,但当应用程序上载文件时,它会冻结窗口。上传后,一切都恢复正常,但不是在上传过程中。我知道它可以上传,因为它可以工作,并且可以在控制台中显示进度。所以,我试着把所有的计算转移到另一个线程上。它仍然正常运行,但冻结了。此外,我读到了关于SwingWorker的文章,我尝试了一下,但它仍然冻结了主GUI 这是SwingWorker的类(所有方法都是有序的,因此您不应该丢失,并且每个方法都包含一条注释来解释目的)(这是大量代码,但您实际上只需要查看BeginUpload()方法,因为循环就位于此) 为了更好地衡量,以下是文本提示:Java LibGDX SwingWorker冻结GUI(块上传程序),java,multithreading,user-interface,freeze,swingworker,Java,Multithreading,User Interface,Freeze,Swingworker,我目前正在开发一个区块上传器(Java)来将文件上传到私有服务器。一切都很完美,但当应用程序上载文件时,它会冻结窗口。上传后,一切都恢复正常,但不是在上传过程中。我知道它可以上传,因为它可以工作,并且可以在控制台中显示进度。所以,我试着把所有的计算转移到另一个线程上。它仍然正常运行,但冻结了。此外,我读到了关于SwingWorker的文章,我尝试了一下,但它仍然冻结了主GUI 这是SwingWorker的类(所有方法都是有序的,因此您不应该丢失,并且每个方法都包含一条注释来解释目的)(这是大量代
public class TextPrompt implements TextInputListener {
private String Text="";
public boolean Active;
private String Return;
private ChunkUploader parent;
public TextPrompt() {
Active = false;
}
public void Prepare(String Return, ChunkUploader Parent) {
Active = true;
this.Return=Return;
this.parent=Parent;
}
@Override
public void input(String text) {
Text = text;
Active = false;
parent.PromptReturn(Return, Text);
}
@Override
public void canceled() {
Text = "";
Active = false;
}
public String GetInput() {
return Text;
}
}
同样,只要文件没有上传,一切正常。我只是感到困惑,因为如果它是在一个单独的线程上上传的,那么它不应该与GUI冲突。有人能告诉我我做错了什么吗?好吧,看来这方面有一些问题。首先,ChunkUploader类中的所有方法都需要由doInBackground()调用。当您查看PromptReturn方法内部时,BeginUpload();被称为 要解决这个问题,我们需要有点创意。以下是应进行的更改: 需要创建doInBackground()和PromptReturn()都可以访问的布尔变量。其初始值应为false 接下来,对前几个方法进行此更改:
private boolean Begin = false;
public void PromptReturn(String Return, String Text) {
//Reads the user input into the variable Password. Starts the upload
if(Return.equals("Password")) {
Password=Text;
//BeginUpload();
Begin = true;
}
}
@Override
protected String doInBackground() throws Exception {
//Calls the first method, and waits to call the second.
PrepareUpload(FileName);
boolean run=true;
while(run) {
if(Begin) {
BeginUpload()
run=false;
}
}
return null;
}
此外,值得注意的是,您使用的Base64编码器仅适用于桌面应用程序。你应该考虑使用它来满足你当前的所有需求,并且非常容易实现。只需将Base64.java复制到您的项目中,您现在就可以将其用于桌面和android。好的,看来这方面存在一些问题。首先,ChunkUploader类中的所有方法都需要由doInBackground()调用。当您查看PromptReturn方法内部时,BeginUpload();被称为 要解决这个问题,我们需要有点创意。以下是应进行的更改: 需要创建doInBackground()和PromptReturn()都可以访问的布尔变量。其初始值应为false 接下来,对前几个方法进行此更改:
private boolean Begin = false;
public void PromptReturn(String Return, String Text) {
//Reads the user input into the variable Password. Starts the upload
if(Return.equals("Password")) {
Password=Text;
//BeginUpload();
Begin = true;
}
}
@Override
protected String doInBackground() throws Exception {
//Calls the first method, and waits to call the second.
PrepareUpload(FileName);
boolean run=true;
while(run) {
if(Begin) {
BeginUpload()
run=false;
}
}
return null;
}
此外,值得注意的是,您使用的Base64编码器仅适用于桌面应用程序。你应该考虑使用它来满足你当前的所有需求,并且非常容易实现。只需将Base64.java复制到您的项目中,您就可以将其用于桌面和android。没问题。祝你在未来的努力中好运。没问题。祝你在未来的努力中好运。
private boolean Begin = false;
public void PromptReturn(String Return, String Text) {
//Reads the user input into the variable Password. Starts the upload
if(Return.equals("Password")) {
Password=Text;
//BeginUpload();
Begin = true;
}
}
@Override
protected String doInBackground() throws Exception {
//Calls the first method, and waits to call the second.
PrepareUpload(FileName);
boolean run=true;
while(run) {
if(Begin) {
BeginUpload()
run=false;
}
}
return null;
}