Java LibGDX SwingWorker冻结GUI(块上传程序)

Java LibGDX SwingWorker冻结GUI(块上传程序),java,multithreading,user-interface,freeze,swingworker,Java,Multithreading,User Interface,Freeze,Swingworker,我目前正在开发一个区块上传器(Java)来将文件上传到私有服务器。一切都很完美,但当应用程序上载文件时,它会冻结窗口。上传后,一切都恢复正常,但不是在上传过程中。我知道它可以上传,因为它可以工作,并且可以在控制台中显示进度。所以,我试着把所有的计算转移到另一个线程上。它仍然正常运行,但冻结了。此外,我读到了关于SwingWorker的文章,我尝试了一下,但它仍然冻结了主GUI 这是SwingWorker的类(所有方法都是有序的,因此您不应该丢失,并且每个方法都包含一条注释来解释目的)(这是大量代

我目前正在开发一个区块上传器(Java)来将文件上传到私有服务器。一切都很完美,但当应用程序上载文件时,它会冻结窗口。上传后,一切都恢复正常,但不是在上传过程中。我知道它可以上传,因为它可以工作,并且可以在控制台中显示进度。所以,我试着把所有的计算转移到另一个线程上。它仍然正常运行,但冻结了。此外,我读到了关于SwingWorker的文章,我尝试了一下,但它仍然冻结了主GUI

这是SwingWorker的类(所有方法都是有序的,因此您不应该丢失,并且每个方法都包含一条注释来解释目的)(这是大量代码,但您实际上只需要查看BeginUpload()方法,因为循环就位于此)

为了更好地衡量,以下是文本提示:

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;
}