这是我申请的一部分。 (您可以将下面的代码作为独立的应用程序运行)在该网站(url)上,使用php语言,从其他网站解析一些数字,并创建一个数组并将其编码为JSON数组,然后显示。
但是,使用下面的代码(没有关闭函数!)在doInBackground之后出现ProgressDialog。
当我向onPostExecute添加dismiss函数时,如下所示,它永远不会出现。但是当我设置日志以检查对话框窗口时,它说有一个对话框。
我听说doInBackground会冻结UI,但会在显示对话框之前冻结。
其他类似问题已经找到解决方案,从mAsyncTask()。execute()。get()中删除.get(),但我的代码中没有任何get()。
布尔变量loadfinish用于等待完成asynctask,以显示asynctask之后来自该网站的结果。如果我删除
while(loadFinish == false)
在那里,它会自动显示并消失得很好,但我无法立即显示结果......
添加)我发现在doInBackground之后出现对话需要几秒钟......为什么?!
Add2)我试图在new mAsyncTask().execute()
之前和之后移动对话框代码,但它也不起作用......
public class MainActivity extends Activity {
boolean loadFinish;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button start = (Button) findViewById(R.id.start);
//just a button for starting asynctask
start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
loadFinish = false;
new mAsyncTask().execute();
// get and make json array to java array
while (loadFinish == false)
;
}
});
// add array to Custom_List_Data, and set custom row_adapter to listView.
// if I delete while(loadFinish == false), array with initial data is added.
}
private class mAsyncTask extends AsyncTask<String, String, String> {
ProgressDialog dialog;
@Override
protected void onPreExecute() {
super.onPreExecute();
dialog = new ProgressDialog(MainActivity.this);
dialog.setMessage("asdf");
dialog.setIndeterminate(true);
dialog.setCancelable(false);
dialog.show();
}
@Override
protected String doInBackground(String... params) {
String url = "http://songdosiyak.url.ph/MouiRate/etoos/3/main/";
String response_str = "";
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(url);
ResponseHandler<String> responseHandler = new BasicResponseHandler();
try {
response_str = client.execute(request, responseHandler);
} catch (ClientProtocolException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
loadFinish = true;
return null;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
dialog.dismiss();
}
}
}
抱歉我的英语能力差,感谢您的阅读!
答案 0 :(得分:1)
正如Gabe所说,你不需要循环,你需要的是更多地了解异步方法应该做什么。
您介绍了结果,因为您想显示结果。您所要做的就是在response_str
中退回doInBackground
。然后它将作为onPostExecute
的参数提供给您,您可以在其中轻松地显示它,或者做任何您需要做的事情。
总结一下:
response_str
或来自doInBackground
onPostExecute
loadFinish
变量,因为它根本不需要希望有所帮助。
答案 1 :(得分:0)
因为您使用的AsyncTask完全错误。您正忙着循环等待它完成。永远不要这样做 - 如果你这样做,那么使用AsyncTask是没有意义的。无论如何,它不会出现的原因是UI不会更新,直到UI线程返回到Android框架内的事件循环并运行绘图代码,这在onClick返回后发生。因此,在忙碌的循环退出之前,您将无法绘制,这在doInBackground完成后会发生。
解决方案是删除等待AsyncTask在onClick中完成的循环。如果您有需要在其后运行的逻辑,请将其放入onPostExecute。
答案 2 :(得分:0)
使用异步库可能值得研究。
使用库来帮助处理异步回调对此非常有用,因为您可以启动微调器,调用api,然后在onSuccess函数或类中的成功回调方法中停止微调器。
这是我经常使用的那个:
<强> LoopJ's Async HTTP Callback Library 强>
这将处理GET和POST请求,具有许多很酷的功能,如自定义超时,JSON格式,onSuccess()和onFailure()方法等。这个库也有很多工作示例。我已经在我的所有应用中使用过它,并且还没有任何问题!
希望这有帮助。