Android的AsyncTask線程限制?


Answers

@antonyt有正確的答案,但如果你正在尋求一個簡單的解決方案,那麼你可以檢查出Needle。

有了它,你可以定義一個自定義的線程池大小,而不像AsyncTask ,它可以在所有的 Android版本上工作。 有了它,你可以說這樣的事情:

Needle.onBackgroundThread().withThreadPoolSize(3).execute(new UiRelatedTask<Integer>() {
   @Override
   protected Integer doWork() {
       int result = 1+2;
       return result;
   }

   @Override
   protected void thenDoUiRelatedWork(Integer result) {
       mSomeTextView.setText("result: " + result);
   }
});

或類似的東西

Needle.onMainThread().execute(new Runnable() {
   @Override
   public void run() {
       // e.g. change one of the views
   }
}); 

它甚至可以做更多。 在GitHub查看它。

Question

我正在開發一個應用程序,我需要每次用戶登錄到系統時更新一些信息,我也在手機中使用數據庫。 對於所有這些操作(更新,從數據庫檢索數據等),我使用異步任務。 到目前為止,我不明白為什麼我不應該使用它們,但是最近我體驗到,如果我執行一些操作,一些異步任務就停止在預執行並且不跳到doInBackground。 這太離奇了,不能保留它,所以我開發了另一個簡單的應用程序來檢查什麼是錯的。 奇怪的是,當總異步任務數達到5時,我得到相同的行為,第6個人在預執行時停止。

活動/應用程序中的android是否有asyncTasks的限制? 還是只是一些錯誤,它應該被報告? 有沒有人遇到同樣的問題,也許找到了解決辦法?

代碼如下:

只需創建5個線程即可在後台工作:

private class LongAsync extends AsyncTask<String, Void, String>
{
    @Override
    protected void onPreExecute()
    {
        Log.d("TestBug","onPreExecute");
        isRunning = true;
    }

    @Override
    protected String doInBackground(String... params)
    {
        Log.d("TestBug","doInBackground");
        while (isRunning)
        {

        }
        return null;
    }

    @Override
    protected void onPostExecute(String result)
    {
        Log.d("TestBug","onPostExecute");
    }
}

然後創建這個線程。 它將進入preExecute並掛起(它不會去doInBackground)。

private class TestBug extends AsyncTask<String, Void, String>
{
    @Override
    protected void onPreExecute()
    {
        Log.d("TestBug","onPreExecute");

        waiting = new ProgressDialog(TestActivity.this);
        waiting.setMessage("Loading data");
        waiting.setIndeterminate(true);
        waiting.setCancelable(true);
        waiting.show();
    }

    @Override
    protected String doInBackground(String... params)
    {
        Log.d("TestBug","doInBackground");
        return null;
    }

    @Override
    protected void onPostExecute(String result)
    {
        waiting.cancel();
        Log.d("TestBug","onPostExecute");
    }
}



Links