[英]Asynctask slow down issue
我正在嘗試檢查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();
}
}
這是我的asynctask代碼
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();
}
}
AsyncTask
cancel方法不會立即停止您的AsyncTask
,而是只會在doInBackground
完成后才“取消”。 ( 參考 )
調用此方法會導致
onCancelled(java.lang.Object)
被調用后在UI線程上doInBackground(java.lang.Object[])
的回報。 調用此方法可確保onPostExecute(Object)
永遠不會隨后被調用,即使cancel返回false,但onPostExecute(Result)
尚未運行。 要盡早完成任務,請定期從doInBackground(java.lang.Object[])
檢查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;
}
我看到您實際上已經閱讀了手冊! 干得好!
不幸的是,盡管付出了很大的努力,但基本方法確實行不通。
我尚不清楚是什么原因導致應用程序運行緩慢。 如果“重新啟動”是指向后箭頭,然后從桌面啟動,則in可能是因為您一次運行了許多下載。 請注意,一旦啟動AsyncTask
,就無法停止它: cancel
實際上不會執行任何操作,除非您實現了它。
您的AsyncTask
存在泄漏上下文的所有典型問題(Studio可能已經對此大喊大叫:請注意)。 沒有理由認為,任務完成后,啟動任務的活動仍然存在。
我的建議是將應用程序的狀態與查看該狀態的活動分開。 這種方法有很多名稱,但通常都類似於ViewModel。 View模型是一種單例,僅允許用戶查看Splash頁面,直到其狀態更改(已下載文件)為止。 然后顯示MainActivity
。
祝好運!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.