Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用AsyncTask填充ListView时的性能问题_Android - Fatal编程技术网

Android 使用AsyncTask填充ListView时的性能问题

Android 使用AsyncTask填充ListView时的性能问题,android,Android,实际上,我使用AsyncTask填充我的ListView。代码如下所示: private class MyAsyncTask extends AsyncTask<Void, Message, Void> { ArrayAdapter<Message> adapter; public MyAsyncTask{ adapter = ( ( ArrayAdapter<Message> ) mListView.getAdapte

实际上,我使用AsyncTask填充我的ListView。代码如下所示:

private class MyAsyncTask extends AsyncTask<Void, Message, Void> {

    ArrayAdapter<Message> adapter;

    public MyAsyncTask{
        adapter =   ( ( ArrayAdapter<Message> ) mListView.getAdapter();
    }

    @Override
    protected void onPreExecute () {
        adapter.clear();
        super.onPreExecute();
    }

    @Override
    protected void onProgressUpdate ( Message... values ) {
        adapter.add( values[0] );
        super.onProgressUpdate( values );
    }

    @Override
    protected Void doInBackground ( Void... params ) {

        //Getting my messages

        for ( Message message : messages ) {
            publishProgress( message );
        }

        //Other heavy stuff

        return null;
    }
}
private class MyAsyncTask extends AsyncTask<Void, Message, Void> {

    ArrayAdapter<Message> adapter;
    List<Message> messages;

    public MyAsyncTask{
        adapter =   ( ( ArrayAdapter<Message> ) mListView.getAdapter();
    }

    @Override
    protected void onPreExecute () {
        adapter.clear();
        super.onPreExecute();
    }

    @Override
    protected void onProgressUpdate ( Void... values ) {
        for(Message message: messages){
            adapter.add(message);
        }
        super.onProgressUpdate( values );
    }

    @Override
    protected Void doInBackground ( Void... params ) {

        messages =  //Getting my messages

        publishProgress();

        //Other heavy stuff

        return null;
    }
}
私有类MyAsyncTask扩展了AsyncTask{
阵列适配器;
公共MyAsyncTask{
适配器=((ArrayAdapter)mListView.getAdapter();
}
@凌驾
受保护的void onPreExecute(){
适配器。清除();
super.onPreExecute();
}
@凌驾
受保护的void onProgressUpdate(消息…值){
adapter.add(值[0]);
super.onProgressUpdate(值);
}
@凌驾
受保护的Void doInBackground(Void…参数){
//收到我的留言
用于(消息:消息){
出版进度(信息);
}
//其他重物
返回null;
}
}
通过traceview,我发现由于在一个周期中调用publishProgress,会产生很大的开销。我认为这样修改代码:

private class MyAsyncTask extends AsyncTask<Void, Message, Void> {

    ArrayAdapter<Message> adapter;

    public MyAsyncTask{
        adapter =   ( ( ArrayAdapter<Message> ) mListView.getAdapter();
    }

    @Override
    protected void onPreExecute () {
        adapter.clear();
        super.onPreExecute();
    }

    @Override
    protected void onProgressUpdate ( Message... values ) {
        adapter.add( values[0] );
        super.onProgressUpdate( values );
    }

    @Override
    protected Void doInBackground ( Void... params ) {

        //Getting my messages

        for ( Message message : messages ) {
            publishProgress( message );
        }

        //Other heavy stuff

        return null;
    }
}
private class MyAsyncTask extends AsyncTask<Void, Message, Void> {

    ArrayAdapter<Message> adapter;
    List<Message> messages;

    public MyAsyncTask{
        adapter =   ( ( ArrayAdapter<Message> ) mListView.getAdapter();
    }

    @Override
    protected void onPreExecute () {
        adapter.clear();
        super.onPreExecute();
    }

    @Override
    protected void onProgressUpdate ( Void... values ) {
        for(Message message: messages){
            adapter.add(message);
        }
        super.onProgressUpdate( values );
    }

    @Override
    protected Void doInBackground ( Void... params ) {

        messages =  //Getting my messages

        publishProgress();

        //Other heavy stuff

        return null;
    }
}
私有类MyAsyncTask扩展了AsyncTask{
阵列适配器;
列出信息;
公共MyAsyncTask{
适配器=((ArrayAdapter)mListView.getAdapter();
}
@凌驾
受保护的void onPreExecute(){
适配器。清除();
super.onPreExecute();
}
@凌驾
受保护的void onProgressUpdate(void…值){
用于(消息:消息){
adapter.add(消息);
}
super.onProgressUpdate(值);
}
@凌驾
受保护的Void doInBackground(Void…参数){
messages=//获取我的消息
出版进度();
//其他重物
返回null;
}
}
这一行看起来更快,因为在后台线程和ui线程之间发送的消息更少,但如果我的列表很大,我恐怕会遇到ANR。 有什么模式可以优化这类问题吗

谢谢:)

通过traceview,我发现由于在一个周期中调用publishProgress,会产生很大的开销

这有点令人惊讶

有什么模式可以优化这类问题吗

将项目添加到
doInBackground()
中的适配器中,并执行其他操作作为进度指示器,例如
ProgressBar