Android主线程做了太多的工作
无论出于什么原因,这个程序中的主线程都做了太多的工作。我不知道如何在主线程上使用视图。我尝试过使用AsyncTask,但不知道该如何使用它Android主线程做了太多的工作,android,multithreading,Android,Multithreading,无论出于什么原因,这个程序中的主线程都做了太多的工作。我不知道如何在主线程上使用视图。我尝试过使用AsyncTask,但不知道该如何使用它 Thread thread2 = new Thread(){ public void run(){ while(running){ runOnUiThread(new Runnable() { @Override
Thread thread2 = new Thread(){
public void run(){
while(running){
runOnUiThread(new Runnable() {
@Override
public void run() {
try{
if(red){
buttons[ran].setImageResource(R.drawable.button_red);
buttons[ran].setTag("Red");
Thread.sleep(duration);
if(buttons[ran].getTag().equals("Red")){
buttons[ran].setTag("Black");
buttons[ran].setImageResource(R.drawable.button_null);
lifeLost();
red = false;
}
}else if(white){
buttons[ran].setImageResource(R.drawable.button_white);
buttons[ran].setTag("White");
Thread.sleep(duration);
if(buttons[ran].getTag().equals("White")){
buttons[ran].setTag("Black");
buttons[ran].setImageResource(R.drawable.button_null);
lifeLost();
white = false;
}
}
}catch(Exception e){
}
}
});
try {
sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
thread2.start();
这个线程正在执行我能给它的任何与UI无关的任务。代码本身实际上在这个线程上工作。然而,它只适用于较新的设备,而较旧的设备似乎会发现错误,而不是忽略它
@Override
public void run() {
random = new Random();
random2 = new Random();
try{
Thread.sleep(1000);
while(running){
ran = random.nextInt(9);
type = random2.nextInt(3);
if(lives > 0){
if(type == 0 || type == 2){
red = true;
}else{
white = true;
}
if(lives == 0){
Thread.sleep(1000);
Intent overIntent = new Intent(this, OverActivity.class);
overIntent.putExtra("point", score);
startActivity(overIntent);
overridePendingTransition(0, 0);
}
if(score == 10){
duration -= 50;
}else if(score == 20){
duration -= 50;
}else if(score == 30){
duration -= 50;
}else if(score == 40){
duration -= 50;
}
}
}
}catch(Exception e){
e.printStackTrace();
}
}
您可以创建一个类
public class DoCalculationAsyncTask extends AsyncTask<Void, Void, DataType> {
@SuppressLint("StaticFieldLeak")
private Context mContext;
public DoCalculationAsyncTask(Context context) {
}
@Override
protected Bitmap doInBackground(Void... params) {
try {
} catch (Exception e) {
e.printStackTrace();
} finally {
}
return something;
}
@Override
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
} }
runOnUiThread
命令中的所有内容都在UI线程上运行(顾名思义),其中包括对thread.sleep(duration)
的调用(从而导致UI线程挂起/执行太多工作)。作为一个简单的第一步,尝试将其分为两个调用runOnUiThread
,并将Thread.sleep(duration)
语句放在它们之间,而不是放在它们之间。您可以简单地将代码放在后台任务中,让它为您返回结果。您正在调用runOnUiThread。这意味着它实际上在UI线程上运行,而该线程没有做任何事情。这意味着您在UI线程上调用sleep,这绝不是一个好主意。取出runOnUIThread并在线程上实际运行,只放在runOnUIThread视图上实际调用函数的代码。@BashorunOlajide我会试试的,谢谢。@GabeSechan以前已经试过了。没有work@Neptune我不能保证这是足够的,但这是必要的。任何输入runOnUIThread的内容都会在ui线程上运行。你不能在上面睡觉。你不能永远在上面循环。你的代码以任何形式在runOnUiThread中放入大的块都不会工作。我不知道我应该如何在这里实现我的代码。我需要上传位图,然后让它将值分配给按钮吗?不!您可以始终以这种方式编写背景代码并返回值。这是一个输入错误,我没有完全清理位图代码
try {
DoCalculationAsyncTask doCalculationAsyncTask = new
DoCalculationAsyncTask(value 1, value 2, value 3, ...);
doCalculationAsyncTask.execute();
} catch (Throwable throwable) {
throwable.printStackTrace();
}