java - Android 应用程序和 AsyncTask 未按预期运行

标签 java android android-asynctask progressdialog

我有一个 Android 应用程序,它使用单独的类与服务器进行通信。这工作正常,但是当我按下应用程序上的按钮(将消息发送到服务器)时,按钮会变为灰色,并且所有内容都会挂起,直到收到响应。我宁愿让应用程序显示一个 ProgressDialog,以便用户可以看到某些事情肯定正在发生(而不仅仅是认为它被卡住了)。

我尝试使用 AsyncTask 执行此操作,但由于某种原因它不起作用。

这是我用来与服务器通信的类:

public class ServerConnection extends AsyncTask<String, Void, String> {

    private Context context;
    private ProgressDialog dialog;

    public ServerConnection(Context ctx){
        context = ctx;
        dialog = new ProgressDialog(context);
        dialog.setTitle("Waiting...");
        dialog.setMessage("...on the world to change.");
    }

    @Override
    protected void onPreExecute() {
        dialog.show();
    }

    @Override
    protected void onPostExecute(String unused) {
        dialog.dismiss();
    }

    protected String doInBackground(String... msg) {
        String response = null;
        try{
            /**
             *
             * Connects to server, sends message to server, waits for and receives a reponse from server
             *
             **/
        } catch(Exception e) {
            e.printStackTrace();
        }
        return response;
    }
}

这就是我使用它的方式(请注意,这些行将从 Activity 中的某些方法调用):

ServerConnection conn = new ServerConnection(this);
String response = null;
try {
    response = conn.execute("ThisIsAMessageToTheServer").get();
} catch (Exception e){e.printStackTrace();}

当我单击按钮时,会执行一小段代码,几秒钟后,会从服务器收到响应。因此,只要与服务器通信并得到正确的响应,代码绝对可以正常工作。唯一的问题是 ProgressDialog 永远不会显示。

我浏览过 Google,我遇到的每个示例似乎都与此完全一样,所以我不确定是什么导致了问题。

最佳答案

我同意Golu's answer 。除此之外, 我建议您仅在 activity 中创建 AsyncTask 。这样您就可以仅根据 onPostExecute() 中获得的响应来执行所有 UI 相关操作。

但是,如果您希望继续使用现在的结构,请创建一个提供回调方法的接口(interface)。将您的 Activity 设置为监听器并在 Activity 中实现该方法。

因为在 doInBackground 中获得的响应将被传递给异步任务的 onPostExecute() 。在执行后,您可以使用接口(interface)的回调方法将结果发送回您的 Activity 。

//创建接口(interface)如下:

public interface OnResponseReceivedListener{
      public void onResponseReceived(String response);
}

//修改您的 Activity 代码如下

public yourActivity extends Activity implements OnResponseReceivedListener {


    ServerConnection conn = new ServerConnection(this);
    conn.setResponseListener(this);

    public void onResponseReceived(String response){

     // TODO: do your UI operations based on the response.
    }
}

//如下修改您的 AsyncTask。

public class ServerConnection extends AsyncTask<String, Void, String> {

    OnResponseReceivedListener mListener;

    public void setResponseListener(OnResponseReceivedListener listener){
       mListener = listener;
    }

    // Your rest of the code
    @Override
    protected void onPostExecute(String unused) {
        mListener.onResponseReceived(unused);
        dialog.dismiss();
    }      

}

关于java - Android 应用程序和 AsyncTask 未按预期运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24483833/

相关文章:

java - 无法将字符串类型的数组列表转换为整数数组列表并将新列表传递给方法

android - 如何从android中的numberpicker获取索引值

android - 需要与 Android 中的后台进程和 Activity 进行双向通信 - 建议?

带有自动装箱的三元运算符中的Java NPE?

java.lang.OutOfMemory错误: unable to create new native thread while starting wildfly

java - 在线提交时Java代码错误"NZEC"

android - 资源文件夹中的错误 - Android/Eclipse

具有拖放功能的 Android float 操作按钮

Android:如何在 Activity 被销毁时保留 AsyncTask 实例?

Android AsyncTask 线程限制?