我正在尝试检查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();
}
}
答案 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
。
祝你好运!