Android 跳过147帧!应用程序可能在其主线程上做了太多工作
我理解这个错误的含义。我在stackoverflow.com上发现了许多类似的问题,我试图实现那些建议的答案,但我仍然得到了这个错误。我尝试使用php web服务从mysql数据库服务器提取数据,并尝试使用AsyncTask在listview中显示数据,如下所示:Android 跳过147帧!应用程序可能在其主线程上做了太多工作,android,listview,android-asynctask,Android,Listview,Android Asynctask,我理解这个错误的含义。我在stackoverflow.com上发现了许多类似的问题,我试图实现那些建议的答案,但我仍然得到了这个错误。我尝试使用php web服务从mysql数据库服务器提取数据,并尝试使用AsyncTask在listview中显示数据,如下所示: class LoadAllProducts extends AsyncTask<String, String, ArrayList<HashMap<String, String>>> {
class LoadAllProducts extends AsyncTask<String, String, ArrayList<HashMap<String, String>>>
{
ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();
protected ArrayList<HashMap<String, String>> doInBackground(String... args)
{
List<NameValuePair> params = new ArrayList<NameValuePair>();
JSONObject json = jParser.makeHttpRequest(url_all_products, "GET", params);
Log.d("All Products: ", json.toString());
try {
JSONArray files = json.getJSONArray(TAG_FILES);
for(int i=0;i<files.length();i++)
{
HashMap<String, String> map = new HashMap<String, String>();
JSONObject e = files.getJSONObject(i);
String file_name = e.getString(TAG_FILE_NAME);
String sender = e.getString(TAG_SENDER);
String subject = e.getString(TAG_SUBJECT);
map.put(TAG_SENDER, sender);
map.put(TAG_SUBJECT, subject);
mylist.add(map);
}
} catch (JSONException e)
{
e.printStackTrace();
Log.e("log_tag", "Error parsing data "+e.toString());
}
return mylist;
}
请帮忙,因为首先我是android的初学者,我不知道如何解决这个问题。请检查我的代码并告诉我问题所在。很抱歉,这不是一个非常明智的答案,但我有两条建议。首先,消除
runOnUiThread
调用,因为onPostExecute
已经在ui线程上运行(这就是方法的要点)。这对任何跳帧都没有帮助,但至少可以去掉一些不需要的代码
其次,在
doInBackground
中创建ListAdapter
。我怀疑这会有多大的不同,但是你最好尽可能多地从UI线程中获取信息。因此,您将使用AsyncTask
而不是AsyncTask
。在onPostExecute
、pDialog.discover
和setListAdapter
中只剩下2个方法调用。没有比这更有效的了。如果它仍然跳过帧,我会责怪调试器并继续。如果你的主线程做了这么多工作,这种类型的错误就会出现。基本上,当我们在emulator中测试我们的应用程序时,跳过帧的时间最长,因为它已经很慢了,无法像设备一样处理巨大的操作
我在代码中看到了一个简单的问题。我们知道onPostExecute()在主线程上运行,但仍然在onPostExecute()中使用runOnUiThread(new Runnable()
)
doinbackground方法返回ArrayList,但onpostexecute保留字符串
将其更改为my onPostExecute参数,该参数是您在适配器中使用的ArrayList(mylist)
编辑
class LoadAllProducts extends AsyncTask<String, String, ArrayList<HashMap<String, String>>> {
ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();
protected ArrayList<HashMap<String, String>> doInBackground(String... args){
HttpClient client = new DefaultHttpClient();
HttpGet getData = new HttpGet("your_url");
HttpResponse response = client.execute(getData);
BufferedReader br = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
String data = "";
while((data = br.readLine()) != null){
JsonArray arr = new JsonArray(data);
for(int i=0;i<arr.length();i++)
{
HashMap<String, String> map = new HashMap<String, String>();
JSONObject e = arr.getJSONObject(i);
String file_name = e.getString(TAG_FILE_NAME);
String sender = e.getString(TAG_SENDER);
String subject = e.getString(TAG_SUBJECT);
map.put(TAG_SENDER, sender);
map.put(TAG_SUBJECT, subject);
mylist.add(map);
}
return mylist;
}
protected void onPostExecute(ArrayList<HashMap<String, String>> mylist) {
String[] from = { TAG_SENDER, TAG_SUBJECT };
int[] to = { android.R.id.text1, android.R.id.text2 };
ListAdapter adapter = new SimpleAdapter(AllProductsActivity.this, mylist,
android.R.layout.simple_list_item_2, from , to);
setListAdapter(adapter);
pDialog.dismiss();
}
class LoadAllProducts扩展异步任务{
ArrayList mylist=新的ArrayList();
受保护的ArrayList doInBackground(字符串…args){
HttpClient=new DefaultHttpClient();
HttpGet getData=newhttpget(“您的url”);
HttpResponse response=client.execute(getData);
BufferedReader br=新的BufferedReader(新的InputStreamReader(response.getEntity().getContent());
字符串数据=”;
而((data=br.readLine())!=null){
JsonArray arr=新JsonArray(数据);
对于(int i=0;iNo sir)它并没有解决我的问题。您认为这可能是由于模拟造成的吗?但是我发现您的代码中还有一些其他问题。什么是“jParser”…这是我在我的项目中使用的java类之一。我发现这个帮助很好。只要告诉我你的url是否返回jsonarray。复制并粘贴url到你的浏览器中并检查返回。是的,绝对完美。现在正在工作,非常感谢。
class LoadAllProducts extends AsyncTask<String, String, ArrayList<HashMap<String, String>>> {
ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();
protected ArrayList<HashMap<String, String>> doInBackground(String... args){
HttpClient client = new DefaultHttpClient();
HttpGet getData = new HttpGet("your_url");
HttpResponse response = client.execute(getData);
BufferedReader br = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
String data = "";
while((data = br.readLine()) != null){
JsonArray arr = new JsonArray(data);
for(int i=0;i<arr.length();i++)
{
HashMap<String, String> map = new HashMap<String, String>();
JSONObject e = arr.getJSONObject(i);
String file_name = e.getString(TAG_FILE_NAME);
String sender = e.getString(TAG_SENDER);
String subject = e.getString(TAG_SUBJECT);
map.put(TAG_SENDER, sender);
map.put(TAG_SUBJECT, subject);
mylist.add(map);
}
return mylist;
}
protected void onPostExecute(ArrayList<HashMap<String, String>> mylist) {
String[] from = { TAG_SENDER, TAG_SUBJECT };
int[] to = { android.R.id.text1, android.R.id.text2 };
ListAdapter adapter = new SimpleAdapter(AllProductsActivity.this, mylist,
android.R.layout.simple_list_item_2, from , to);
setListAdapter(adapter);
pDialog.dismiss();
}