尽管我使用AsyncTask应用程序没有响应

问题描述 投票:0回答:1

我编写了一个算法,需要很多性能。我认为这也是为什么当有太多对象要处理时,我的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")

但是它也不起作用。因此,在处理许多对象时,我该怎么办才能不出现“应用程序无响应”对话框。

java android android-asynctask android-anr-dialog
1个回答
0
投票

@ SuppressLint()只是删除警告。问题是您正在从工作线程中调用UI对象视图更新,但是您只能从主线程中调用任何UI对象。

因此,在您的情况下,请在GraphicOverlay类中找到用于更新它们的任何UI对象关系,并在可能的情况下也划分背景线程。

© www.soinside.com 2019 - 2024. All rights reserved.