gpt4 book ai didi

android - 调用 Web 服务或任何网络调用时应用程序挂起

转载 作者:行者123 更新时间:2023-11-30 03:59:29 25 4
gpt4 key购买 nike

在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com