Android 三星s3错误与listview

Android 三星s3错误与listview,android,performance,Android,Performance,我曾经开发过一个自定义列表视图,它是一个下拉刷新列表视图的工具,但它显示了一个奇怪的错误,每当我尝试在galaxy s3上运行它时,它就会开始说 我/编舞(698):跳过了340帧!应用程序可能在其主线程上做了太多工作 而且listview的滚动速度非常慢。附件是在s3和htc设备上测试的视频,它在htc上完美地工作。有什么能说明为什么会这样吗 宏达电: S3: 编辑:添加代码 public class MainActivity extends ListActivity implements O

我曾经开发过一个自定义列表视图,它是一个下拉刷新列表视图的工具,但它显示了一个奇怪的错误,每当我尝试在galaxy s3上运行它时,它就会开始说

我/编舞(698):跳过了340帧!应用程序可能在其主线程上做了太多工作

而且listview的滚动速度非常慢。附件是在s3和htc设备上测试的视频,它在htc上完美地工作。有什么能说明为什么会这样吗

宏达电: S3:

编辑:添加代码

public class MainActivity extends ListActivity implements OnScrollListener {
private LinkedList<String> mListItems;
TmbResultListViewAdapter adapter;
Button editButton;
public static boolean refreshOnDrag = true;
private boolean isloading = false;
private MyTask task;
PullToRefreshListView lv;
private ProgressBar footer;
private TextView statusBar;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRefreshOnPull(true);
    setContentView(R.layout.activity_main);

    statusBar = (TextView) findViewById(R.id.statusbar);

    editButton = (Button) findViewById(R.id.editButton);
    lv = (PullToRefreshListView) getListView();
    lv.setOnRefreshListener(new OnRefreshListener() {
        @Override
        public void onRefresh() {
            // Do work to refresh the list here.
            if (refreshOnDrag) {
                new GetDataTask().execute();
            }
        }
    });
    lv.setOnScrollListener(this);
    lv.setScrollingCacheEnabled(false);
    LayoutInflater inflater = (LayoutInflater)     getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    footer = (ProgressBar) inflater.inflate(R.layout.footer, null);

    mListItems = new LinkedList<String>();
    mListItems.addAll(Arrays.asList(mStrings));

    // ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
    // android.R.layout.simple_list_item_1, mListItems);

    adapter = new TmbResultListViewAdapter(this);
    setListAdapter(adapter);
}

public void edit(View v) {
    if (!adapter.showEditControlls) {
        adapter.showEditControlls = true;
        adapter.notifyDataSetChanged();
        editButton.setText("Done");
    } else {
        adapter.showEditControlls = false;
        adapter.notifyDataSetChanged();
        editButton.setText("Edit");
    }
}

public void setRefreshOnPull(boolean val) {
    this.refreshOnDrag = val;
}

private class GetDataTask extends AsyncTask<Void, Void, String[]> {

    @Override
    protected String[] doInBackground(Void... params) {
        // Simulates a background job.
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            ;
        }
        adapter.resetItems();
        return mStrings;
    }

    @Override
    protected void onPostExecute(String[] result) {
        mListItems.addFirst("Added after refresh...");

        // Call onRefreshComplete when the list has been refreshed.
        ((PullToRefreshListView) getListView()).onRefreshComplete();
        super.onPostExecute(result);
    }
}

private String[] mStrings = { "Abbaye de Belloc",
        "Abbaye du Mont des Cats", "Abertam", "Abondance", "Ackawi",
        "Acorn", "Adelost", "Affidelice au Chablis", "Afuega'l Pitu",
        "Airag", "Airedale", "Aisy Cendre", "Allgauer Emmentaler" };

@Override
public void onScroll(AbsListView view, int firstVisibleItem,
        int visibleItemCount, int totalItemCount) {

    int loadedItems = firstVisibleItem + visibleItemCount;
    int offSet = (((int) ((firstVisibleItem - 1) / adapter.getItemPerPage())) *  adapter
            .getItemPerPage()) + 1;
    statusBar.setText(offSet + " of "
            + (offSet + adapter.getItemPerPage() - 1));
    if ((loadedItems == totalItemCount) && !isloading) {
        if (task == null || (task.getStatus() == AsyncTask.Status.FINISHED)) {
            task = new MyTask();
            task.execute();
        }
    }

}

@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
    // TODO Auto-generated method stub

}

class MyTask extends AsyncTask<Void, Void, Void> {
    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
        ((PullToRefreshListView) getListView()).addFooterView(footer);
        // adapter.notifyDataSetChanged();
    }

    @Override
    protected Void doInBackground(Void... params) {
        isloading = true;
        adapter.loadMoreData();
        // ProgressBar pb = new ProgressBar(getApplicationContext(), null,
        // android.R.attr.progressBarStyleHorizontal);
        // LinearLayout linLayout = (LinearLayout)
        // findViewById(R.id.linearLayout);
        // linLayout.addView(pb);
        Log.d("*****", "Loading...");
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        // adapter.notifyDataSetChanged();
        isloading = false;
        adapter.notifyDataSetChanged();
        ((PullToRefreshListView) getListView()).removeFooterView(footer);
    }
}

@Override
public void onBackPressed() {
    finish();

}
}

对于其他人来说,面对同样的问题,你必须查看一些使用了大量内存的地方,在我的情况下,是listview中的图像导致了问题,我已经用质量较低的图像替换了该图像,现在它工作正常,但我仍然无法理解,同一列表视图如何在低端设备上比在高端设备上工作得更好。超越我。

看在上帝的份上,无论你相信什么,只要读一下这条信息就行了。您必须在后台线程中执行繁重的负载,即任何数据获取都会进入异步任务。你在HTC设备上很幸运。三星做了很多错事,但你肯定要为这种行为负责。另外:HTC设备上的滚动也非常缓慢。如果你能显示代码,那就容易多了。您是否在UI线程上执行任何后台操作(如调用Web服务等)?看到每个厂商都定制了安卓系统,三星的问题可能是,与HTCSamsung设备相比,获得错误的门槛要低一些。三星设备似乎对UI线程非常敏感。您是否正在从Web服务加载图像/数据?(如果是这样,在UI线程上?)代码被添加,我已经尝试在后台线程上做尽可能多的工作,但是错误仍然存在,那么您很可能太频繁地触发数据获取的执行。尝试添加
refreshOnDrag=false
to
if(refreshOnDrag){new GetDataTask().execute();}
。或者出于调试目的:记录
execute
方法并观察日志是否被淹没
    public View getView(final int position, View convertView, ViewGroup parent) {
    //View convertView = convertView;
    // TmbJSON eventDetail;

    if (convertView == null) {
        convertView = inflater.inflate(R.layout.tmb_result_listitem, null);
        mViewHolder = new viewHolder();

        mViewHolder.resultTitle = (TextView) convertView
                .findViewById(R.id.resultTitle);
        mViewHolder.resultPeriod = (TextView) convertView
                .findViewById(R.id.resultPeriod);
        mViewHolder.resultVenue = (TextView) convertView
                .findViewById(R.id.resultVenue);
        mViewHolder.resultDescription = (TextView) convertView
                .findViewById(R.id.resultDescription);
        mViewHolder.resultIcon = (ImageView) convertView
                .findViewById(R.id.resultIcon);
        mViewHolder.checkUnCheckIcon = (ImageView) convertView
                .findViewById(R.id.checkuncheckicon);
        mViewHolder.layout = (LinearLayout) convertView.findViewById(R.id.linearLayout);
        mViewHolder.headerTextView = (TextView) convertView.findViewById(R.id.itemheader);

        convertView.setTag(mViewHolder);
    } else {
        mViewHolder = (viewHolder) convertView.getTag();
    }
    try {

        mViewHolder.checkUnCheckIcon.setVisibility(showEditControlls ? ImageView.VISIBLE : ImageView.GONE);
        mViewHolder.checkUnCheckIcon.setImageResource(mCheckedState.get(position) ? R.drawable.starschecked : R.drawable.starsunchecked);
        mViewHolder.checkUnCheckIcon.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                if (mCheckedState.get(position)) {
                    mViewHolder.checkUnCheckIcon
                            .setImageResource(R.drawable.starsunchecked);
                    mCheckedState.set(position, false);
                } else if (!mCheckedState.get(position)) {

                    mViewHolder.checkUnCheckIcon
                            .setImageResource(R.drawable.starschecked);
                    mCheckedState.set(position, true);
                }
                theAdapter.notifyDataSetChanged();
                Toast.makeText(activity.getApplicationContext(), position+"th Event un/checked", Toast.LENGTH_LONG).show();
            }
        });


        String name = masterList.get(position).name;// eventDetail.smartStringWithPath(TmbJSON.arrayListObjectWithStrings("name"));
        String detail = masterList.get(position).detail;// eventDetail.smartStringWithPath(TmbJSON.arrayListObjectWithStrings("detail"));
        String venue = masterList.get(position).venue;// ((JSONObject)eventDetail.object).getJSONArray("prs").getJSONObject(0).getJSONObject("loc").getString("name");
        String period = masterList.get(position).period;// ((JSONObject)eventDetail.object).getJSONArray("prs").getJSONObject(0).getString("ts_z");

        mViewHolder.resultTitle.setText(name);
        mViewHolder.resultPeriod.setText(period);
        mViewHolder.resultVenue.setText(venue);
        mViewHolder.resultDescription.setText(detail);
        if((position) % (itemPerPage) == 0 && position!=0)
        {   mViewHolder.headerTextView.setText((position+1)+" of "+(int)(position+20));
            mViewHolder.headerTextView.setVisibility(TextView.VISIBLE);
        }
        else
        {
            mViewHolder.headerTextView.setVisibility(TextView.GONE);

        }
        int forthPos = getCount() - itemPerPage + 4;
        int tenthPos = getCount() -  itemPerPage + 10;
        int sixteenthPos = getCount() - itemPerPage + 16;

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




    return convertView;
}