簡體   English   中英

Asynctask減慢問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM