2014-02-18 64 views
0

我是使用AsyncTask的新手。它冻结了我的程序,我不知道为什么。我正在寻找一种方法来返回我放入arrayList中的数据库结果。我用断点和我的doInBackground(String ... args)抓取我想从我的本地数据库中获得的信息。之后,我的程序冻结了。我不知道为什么。我已经在堆栈和谷歌上查找了解决方案,发现很多人都在使用.get(),他们不应该这样做。除非有什么我想念我不是。这里是我的代码,任何想法将不胜感激。AsyncTask冻结我的用户界面,我没有使用.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); 
    } 
+1

你确定它结冰了,不仅花了很长时间来处理?那些是不同的东西。我建议在你的'onCreate()'方法的每一行后面加上'Log.d()'行,看看瓶颈在哪里。 – nKn

+0

我的程序还没有做任何事情,它已经10分钟 – Aaron

+0

也许你的'AsyncTask'没有返回你期望的答案,但这并不意味着你的'AsyncTask'阻止了执行(10分钟是一个巨大的时间挂起,它会被吊死)。我仍然推荐'Log.d()'技术,看看会发生什么。 – nKn

回答

2

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

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

无论你在doInBackground方法中返回什么,都将作为onPostExecute方法的参数传递。

+0

谢谢我在调用AsyncTask之后添加了finish()。现在我要弄清楚如何从onPostExecute获取结果。 – Aaron

+0

不要叫完()。这将有效地终止您的活动。在onCreate中将Activity的内容设置为一些控件,然后在onPostExecute方法中更新该控件的内容。 – Ameen

1

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

+0

有没有可以推荐的解决方法?我知道,当它下降到返回null我有我需要的信息。 – Aaron

1

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

你可以让听众发起某些事件,但似乎你只是觉得它被冻结,因为你的AsyncTask可能没有返回/正在做你期望做的事情,而你认为​​它已被挂起,但10分钟是一个需要等待很长时间才能确定某些事情是无反应的(它会提前挂起),所以我的建议是可能是您的AsyncTask执行者没有处理您正在做的事情,并且应该放几个断点或Log.d()行来调试它并查看瓶颈在哪里。

+0

我使用了断点,并经过了几次代码。它从我的数据库中获得我想要的,然后不做任何事情。我想返回productsList(一个ArrayList),但doInBackground需要是一个字符串。有任何想法吗? – Aaron

+0

检查http://developer.android.com/reference/android/os/AsyncTask.html参考,包含“AsyncTask的泛型类型”部分,它解释了如何传递/返回几种类型的变量。 – nKn

相关问题