[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

나는 사용자가 시스템에 로그인 할 때마다 일부 정보를 업데이트해야하는 응용 프로그램을 개발 중이며 전화에서 데이터베이스도 사용합니다. 모든 작업 (업데이트, db에서 데이터 검색 등)에는 비동기 작업을 사용합니다. 지금까지는 왜 내가 사용하지 말아야하는지 알지 못했지만 최근에는 일부 작업을 수행 할 때 비동기 작업 중 일부가 실행 전 중지되고 doInBackground로 점프하지 않는다는 것을 경험했습니다. 그것은 그렇게 이상하게 남겨 두었습니다. 그래서 나는 무엇이 잘못되었는지 확인하기 위해 또 다른 간단한 응용 프로그램을 개발했습니다. 그리고 이상하게도 전체 비동기 작업의 수가 5에 도달하면 동일한 동작을 얻습니다. 6 번째 작업은 사전 실행시 중지됩니다.

안드로이드는 액티비티 / 앱에서 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