我有一个 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/