AsyncTask冻结了我的UI,我没有使用.get()

时间:2014-02-18 23:11:00

标签: android android-asynctask

我是使用AsyncTask的新手。这是冻结我的计划,我不知道为什么。我正在寻找一种方法来返回我放在arrayList中的db的结果。我使用了断点,我的doInBackground(String ... args)从我的本地数据库中获取了我想要的信息。之后,我的程序冻结了。我不知道为什么。我在堆栈和谷歌上查找了解决方案,发现很多人都在使用.get()而他们不应该这样做。除非有我遗失的东西,否则我不是。这是我的代码,任何想法都将非常感激。

    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    productsList = new ArrayList<HashMap<String, String>>();
    task = new LoadAllProducts();
    task.execute("");

}

class LoadAllProducts extends AsyncTask<String, String, String> {




    protected String doInBackground(String... args) {
        // Building Parameters
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        // getting JSON string from URL
        JSONObject json = null;
        try {
            json = jParser.makeHttpRequest (url_all_product, "GET",
                    params);
        } catch (ClientProtocolException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

        // Check your log cat for JSON reponse
        Log.d("All Products: ", json.toString());

        try {
            // Checking for SUCCESS TAG
            int success = json.getInt(TAG_SUCCESS);

            if (success == 1) {
                // products found
                // Getting Array of Products
                products = json.getJSONArray(TAG_VISITORS);

                // looping through All Products
                for (int i = 0; i < products.length(); i++) {
                    JSONObject c = products.getJSONObject(i);

                    // Storing each json item in variable
                    String id = c.getString(TAG_PID);
                    String name = c.getString(TAG_NAME);
                    String company = c.getString(TAG_COMPANY);

                    // creating new HashMap
                    HashMap<String, String> map = new HashMap<String, String>();

                    // adding each child node to HashMap key => value
                    map.put(TAG_PID, id);
                    map.put(TAG_NAME, name);
                    map.put(TAG_COMPANY, company);

                    // adding HashList to ArrayList
                    productsList.add(map);
                }
            } else {
                // no products found
                // Launch Add New product Activity

        } catch (JSONException e) {
            e.printStackTrace();
        }


        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
    }

3 个答案:

答案 0 :(得分:2)

AsyncTask并未冻结您的用户界面。您的应用程序根本不对UI做任何事情!您的onCreate方法不会使用setContentView来设置您的活动内容,因此它会留空,这可能会让您相信应用程序已挂起。

您的AsyncTask的{​​{1}}返回null,这意味着它不会向doInBackground方法返回任何结果。您应该在onPostExecute中返回http请求的结果,然后在doInBackground中使用数据将其显示在您的用户界面中。 onPostExecute方法将在前台(UI)线程上执行。

您在onPostExecute方法中返回的任何内容都将作为doInBackground方法的参数传递。

答案 1 :(得分:1)

我不知道为什么会发生这种情况,我没有看到任何与众不同的东西。但是,我建议您使用一些不同的库来帮助您清理代码。我建议http-request与您的终端进行通信,然后使用GSON将您的JSON对象转换为POJO。如果GSON最终太慢,你也可以使用Jackson(例如:下载数千行JSON中的10行)。

答案 2 :(得分:1)

退出AsyncTask执行后,程序不必“无处”,它只是保持空闲状态,因为.execute()方法是onCreate()方法的最后一种方法。

你可以让听众发动某些事件,但似乎你感觉它被冻结了,因为你的AsyncTask可能没有返回/做你想做的事情而你认为它已被挂起了,但10分钟是一段时间等待确定某些事情的反应迟钝(它会更早地挂起),所以我的提示是,你的AsyncTask执行可能没有处理你正在做的事情,你应该放几个断点或Log.d()行来调试它,看看瓶颈在哪里。