在 android 应用程序中,当我启动 Activity 时,它显示黑屏或应用程序挂起几秒钟。我想要直到黑屏我想显示进度条。我试了很多次都做不到。
String xml = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>"
+ "<category><Id>" + catId + "</Id></category>";
StringBuilder resXML = new Connection().getResponseString("http://192.168.1.14/virtualMirror/productlisting.php", xml); // TODO URL change
if(!resXML.equals("")) {
XMLParser parser = new XMLParser();
Document doc = parser.getDomElement(resXML.toString()); // getting DOM element
NodeList nodeList = doc.getElementsByTagName("Product");
Intent intent = new Intent(this, ProductListing.class);
Bundle bundle = new Bundle();
bundle.putLong("CategoryId", catId);
bundle.putString("CategoryName", catName);
intent.putExtras(bundle);
startActivity(intent);
}
最佳答案
使用AsyncTask。
AsyncTask 可以正确且轻松地使用 UI 线程。此类允许执行后台操作并在 UI 线程上发布结果,而无需操作线程和/或处理程序。
AsyncTask 在另一个线程内执行 doInBackground()
中的所有内容,该线程无权访问您的 View 所在的 GUI。
preExecute()
和 postExecute()
为您提供在这个新线程中进行繁重工作之前和之后访问 GUI 的权限,您甚至可以传递长的结果对 postExecute() 的操作,然后显示任何处理结果。
class LoadCategory extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
Pd = new ProgressDialog(getApplicationContext());
Pd.show();
}
@Override
protected Void doInBackground(Void... params) {
String xml = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>"
+ "<category><Id>" + catId + "</Id></category>";
StringBuilder resXML = new Connection().getResponseString("http://192.168.1.14/virtualMirror/productlisting.php",xml); // TODO URL change
if (!resXML.equals("")) {
XMLParser parser = new XMLParser();
Document doc = parser.getDomElement(resXML.toString());
NodeList nodeList = doc.getElementsByTagName("Product");
return null;
}
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
Pd.dismiss();
Intent intent = new Intent(this, ProductListing.class);
Bundle bundle = new Bundle();
bundle.putLong("CategoryId", catId);
bundle.putString("CategoryName", catName);
intent.putExtras(bundle);
startActivity(intent);
}
}
并在您的 onCreate()
方法中使用此类。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
new LoadCategory().execute();
}
关于android - 调用 Web 服务或任何网络调用时应用程序挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12745556/