我是使用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);
}
答案 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()
行来调试它,看看瓶颈在哪里。