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

标签 android android-intent

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

相关文章:

未找到 Android MotionEvent 常量和方法

Android- GSON 如何解析不同数据的 JSON 数组?

Android:网络 radio 在 ACTION_SHUTDOWN 事件之前关闭。事件顺序在 ICS 中更改

java - Intent putExtra() 不起作用

android - 跟进 Android 应用程序的密码保护启动

android - Retrofit2 URL 参数上没有键名

android - 如何在 android paging 3 库中标记数据集的结尾?

java - 安卓 5.1 通知

Android - 使我的应用程序可从应用程序列表和 "Share"菜单启动

java - Android启动 Activity 不工作