我编写了一个算法,需要很多性能。我认为这也是为什么当有太多对象要处理时,我的Android应用程序显示“应用程序无响应”对话框的原因。用更少的对象来处理该算法就可以很好地工作。因此,我开始实现ASyncTask(之前从未做过),该函数应该从doInBackground()调用该函数以启动算法。 (启动算法的功能是fillFilteredGraphics(int position))
private class AsyncTaskRunner extends AsyncTask<Void, Integer, Void>{
ProgressDialog progressDialog;
@SuppressLint("WrongThread")
@Override
protected Void doInBackground(Void... voids) {
//This is the important call
mGraphicOverlay.fillFilteredGraphics(0);
return null;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog = ProgressDialog.show(RecognizerActivity.this,
"ProgressDialog",
"Processing results...");
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
progressDialog.dismiss();
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
}
}
并且在onCreate()中:
AsyncTaskRunner runner = new AsyncTaskRunner();
runner.execute();
但是它仍然显示“应用程序无响应”对话框
对象mGraphicsOverlay在onCreate()中定义:GraphicOverlay mGraphicOverlay = findViewById(R.id.graphic_overlay);
您可以看到自定义类GraphicOverlay扩展了View
public class GraphicOverlay extends View {
public GraphicOverlay(Context c, AttributeSet attrs){
super(c, attrs);
}
@Override
protected void onDraw(Canvas canvas){
super.onDraw(canvas);
//do stuff
}
public void fillFilteredGraphics(int position){
//start algorithm
}
}
还有一条错误消息,说
从UI线程调用方法fillFilteredgraphics mut,当前推断的线程是工作线程
所以我在doInBackground()函数的顶部添加了@SuppressLint("WrongThread")
但是它也不起作用。因此,在处理许多对象时,我该怎么办才能不出现“应用程序无响应”对话框。
@ SuppressLint()只是删除警告。问题是您正在从工作线程中调用UI对象视图更新,但是您只能从主线程中调用任何UI对象。
因此,在您的情况下,请在GraphicOverlay类中找到用于更新它们的任何UI对象关系,并在可能的情况下也划分背景线程。