I am very很沮丧,因为我一直在等待网络调用时尝试实现一个超级简单的加载轮。我已经搜索并阅读了几十个这样的问题,我只是觉得我一定错过了一些东西,除非没有人真正做我想做的事情。我尝试过AsyncTask
路线,但这不是我想要的。
我还要说的是,现在我的应用程序运行得很好,只是从一个屏幕到另一个屏幕的转换似乎在等待网络时挂起。我只想要一个加载轮,以便用户在 1-2 秒内知道应用程序正在运行并且没有冻结。
这是我当前的网络调用的样子:
private static String sendDataToServer(String arg1, String arg2)
{
Thread dbThread = new Thread()
{
public void run()
{
// do the call that takes a long time
}
};
dbThread.start();
try {
// I do this so that my program doesn't continue until
// the network call is done and I have received the information
// I need to render my next screen
dbThread.join();
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
现在,为什么我不能添加ProgressDialog
像这样?如果我这样做,进度对话框永远不会出现。
private static String sendDataToServer(String arg1, String arg2)
{
final ProgressDialog progress = new ProgressDialog(BaseActivity.getInstance());
progress.setIndeterminate(true);
progress.setMessage("Loading...");
progress.show();
Thread dbThread = new Thread()
{
public void run()
{
// do the call that takes a long time
}
};
dbThread.start();
try {
dbThread.join();
progress.dismiss();
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
我认为我陷入了困境,因为网络调用需要位于与 UI 线程不同的线程上,但我不想继续我的应用程序,因为我需要该调用的结果才能继续。但如果我这样做thread.join()
我撑起一切。我以为我需要AsyncTask
但这种情况很快就走下坡路了。如果你好奇的话,这是我的问题。Android的AsyncTask:多个参数,返回值,等待 https://stackoverflow.com/questions/15153919/androids-asynctask-multiple-params-returning-values-waiting
当这个调用发生时,我到底如何只显示一个加载对话框,而不继续执行我的应用程序的其余部分?
EDIT
这是我的AsyncTask
试图。
private class PostToFile extends AsyncTask<PostToFile, Void, Void>{
private String functionName;
private ArrayList<NameValuePair> postKeyValuePairs;
private String result = "";
public PostToFile(String function, ArrayList<NameValuePair> keyValuePairs){
functionName= function;
postKeyValuePairs = keyValuePairs;
}
@Override
protected void onPreExecute() {
progressDialog = ProgressDialog.show(BaseActivity.getInstance(), "Loading", "Please wait...", true, false);
}
@Override
protected Void doInBackground(PostToFile... params) {
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair(FUNCTION_KEYWORD, functionName));
for (int i = 0; i < postKeyValuePairs.size(); i++) {
nameValuePairs.add(postKeyValuePairs.get(i));
}
try{
// ***do the POST magic.***
result = response.toString();
}
catch (Exception e){
// clean up my mess
}
return null;
}
private String getResult(){
return result; // can I use this somehow???
}
@Override
protected void onPostExecute(Void result) {
progressDialog.dismiss();
}
}
当我使用它时:
new PostToPHP(FUNCTION_NAME, postPairings){
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
try
{
if (result != null && !result.startsWith("null"))
{
JSONArray jArray = new JSONArray(result);
parseData(jArray);
}
}
catch (JSONException e)
{
Log.e(Constants.LOG_TAG, e.toString());
}
};
}.execute()
问题是,我连续有几个这样的调用,并且它们每个都相互依赖。所以第一个开始,第二个开始立即地在第一个开始之后,但是before第一个是finished。所以我得到了错误的行为。如何在第一个通话完全完成后才开始第二个通话?