gpt4 book ai didi

android - 如何使用 AsyncTask 避免跳帧

转载 作者:太空狗 更新时间:2023-10-29 14:51:59 26 4
gpt4 key购买 nike

我有一个名为 table() 的方法,它生成一个包含 600 行的表。当我在 onCreate() 中运行此方法时,即在主 UI 线程中,我收到一条来自日志的消息:

I/Choreographer: Skipped 32 frames!  The application may be doing too much work on its main thread."

我发现,为了避免跳帧,我应该使用AsyncTask。但是,我不知道如何在后台实现表格生成?我不能将 table() 方法放在 doInBackground(Void... params) 中,因为 doInBackground 不适用于 UI,但是我也不能将此方法放在 onPostExecute 中,因为它会给我跳帧。

AsyncTask 中实现表生成的正确方法是什么?

这是表格方法的代码,我在onCreate()

中运行它
public void table(){
ScrollView scrollView = new ScrollView(this);
HorizontalScrollView horizontalScroll = new HorizontalScrollView(this);
TableLayout tableLayout = new TableLayout(this);
tableLayout.setBackgroundColor(Color.BLACK);

LayoutParams cellsParam = new LayoutParams(
LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT);
cellsParam.setMargins(1, 1, 1, 1);

for(int i = 0; i < 600; i++){
TableRow row = new TableRow(this);
TextView wayTextView = new TextView(this);
wayTextView.setText("text" + i);
wayTextView.setBackgroundColor(Color.WHITE);
wayTextView.setGravity(Gravity.CENTER);
row.addView(wayTextView, cellsParam);

tableLayout.addView(row);
}
horizontalScroll.addView(tableLayout);
scrollView.addView(horizontalScroll);
setContentView(scrollView);
}

最佳答案

有一种叫做“loop unrolling”的做法可以帮助您(但我们这样做不是为了“优化”,而是将循环分成不会阻塞的“一口大小” block UI 线程。)

创建 6 个任务,每个任务执行 100 行:或 10 个任务,每行 60 行(无论哪种方式最适合您的应用。)

我现在已经对此进行了测试,它按预期工作

顶部的“静态”计数是从 0 -> (N-1) 开始计数

package com.example.mike.myapplication;

import android.content.Context;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

static int count = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

int totalCount = 600;
int numTasks = 10;

int division = totalCount / numTasks ;

// where did the other loop
for (int i = 0; i < numTasks ; i++) {
new UpdateRowsTask(this).executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, Integer.valueOf(division));
}
}

public void doLog(String str) {
Log.d("TEST", str);
}

private static class UpdateRowsTask extends AsyncTask<Integer, Void, Void> {
int maxCount ;
MainActivity _activity;

public UpdateRowsTask(MainActivity activity) {
_activity = activity;
}

@Override
protected Void doInBackground(Integer... params) {
maxCount = params[0]; // adjustable
return null;
}

protected void onPostExecute(Void result) {
do {
_activity.doLog("" + count);
count++;
}
while ((count % maxCount) != 0 ) ;
}
}
}

我将“log.d()”作为我的“UI 线程”操作,但您可以轻松地添加行。

关于android - 如何使用 AsyncTask 避免跳帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34536114/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com