Asynctask减慢问题

时间:2019-07-13 12:49:21

标签: java android android-asynctask

我正在尝试检查Asynctask中是否存在2000个文件。 在最初的执行中,它运行良好。 但是,如果我重新启动应用程序大约10次,则加载速度会降低。 作为一名初学者,我对Asynctask缺乏了解。 请给我一些建议。

这是我的飞溅活动

public class SplashActivity extends AppCompatActivity {
    getFirstData gfd;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash);
        gfd = new getFirstData(this, (TextView) findViewById(R.id.textView18));
        gfd.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, this);
    }

    @Override
    protected void onDestroy() {
        try
        {
            if (gfd.getStatus() == AsyncTask.Status.RUNNING)
            {
                gfd.cancel(true);
            }
            else
            {
            }
        }
        catch (Exception e)
        {
        }
        super.onDestroy();
    }
}

这是我的异步任务代码

public class getFirstData extends AsyncTask<Context,Integer,Void> {
    private PowerManager.WakeLock mWakeLock;
    private Context context;
    private TextView textview;
    getFirstData(Context context,TextView tv){
        this.context=context;
        this.textview=tv;
    }
    @Override
    protected void onPreExecute() {
        super.onPreExecute();

        PowerManager pm = (PowerManager) this.context.getSystemService(Context.POWER_SERVICE);
        mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, getClass().getName());
        mWakeLock.acquire();
    }

    @Override
    protected Void doInBackground(Context...contexts) {
        Database.addDB();
        for (int i = 0; i < Database.db_list.size(); i++) {
            File filetemp = Database.getFilename(i, ".pdf", Database.db_list);
            if (filetemp.exists()) {
                Database.db_list.get(i).isDownloaded = true;
            }
            publishProgress(Database.db_list.size(),i);
        }
        return null;
    }

    @Override
    protected void onProgressUpdate(Integer... params) {
        super.onProgressUpdate(params);
        textview.setText("Load("+params[1]*100/params[0]+"%)");
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        Intent intent = new Intent(this.context, MainActivity.class);
        this.context.startActivity(intent);
        ((Activity)this.context).finish();
    }
}

2 个答案:

答案 0 :(得分:0)

AsyncTask取消方法不会立即停止您的AsyncTask,而是只会在doInBackground完成后才“取消”。 (Reference

  

调用此方法将导致onCancelled(java.lang.Object)返回后在UI线程上调用doInBackground(java.lang.Object[])。调用此方法可确保以后不会再调用onPostExecute(Object),即使cancel返回false,但onPostExecute(Result)尚未运行。要尽早完成任务,请定期从isCancelled()检查doInBackground(java.lang.Object[])

如果您希望AsyncTask尽快结束,则每10次迭代(或您认为合适的任何值)进行一次检查。遵循以下内容应该可以。

    @Override
    protected Void doInBackground(Context...contexts) {
        Database.addDB();
        for (int i = 0; i < Database.db_list.size(); i++) {
            File filetemp = Database.getFilename(i, ".pdf", Database.db_list);
            if (filetemp.exists()) {
                Database.db_list.get(i).isDownloaded = true;
            }
            publishProgress(Database.db_list.size(),i);
            if (i%10==0 && isCancelled()) {
                break;
            }
        }
        return null;
    }

答案 1 :(得分:0)

我看到您实际上已经阅读了手册!干得好!

不幸的是,虽然基本方法确实行不通。

我尚不清楚是什么原因导致应用程序运行缓慢。如果“重新启动”是指向后箭头,然后从桌面启动,则in可能是因为您一次运行了许多下载。请注意,AsyncTask一旦启动就无法停止:cancel实际上不会做任何事情,除非您实施它。

您的AsyncTask存在泄漏上下文的所有典型问题(Studio可能已经对此大喊大叫:请注意)。没有理由相信任务完成时启动任务的活动仍然存在。

我的建议是,您将应用程序的状态与查看该状态的活动分开。这种方法有很多名称,但通常都类似于ViewModel。 View模型是一种单例,仅允许用户查看Splash页面,直到其状态更改(已下载文件)为止。然后显示MainActivity

祝你好运!