0

내 시나리오는 다음과 같다 :있는 나는 3 초 제한 시간 HttpGet 요청 스레드 (T1)와 함께 AsyncTask을 시작 내가 활동 A, 이 밖으로 T1 시간 후 , 나는 30 대 타임 아웃 HttpGet 요청 T2 시작 .활동을 닫고 시작할 때 내 활동의 스레드가 동기화 된 방식으로 수행되는 이유는 무엇입니까?

이제 액티비티 A를 시작하고, 의도적으로 프록시 피들러로 HttpPost 요청을 던집니다. t1 시간이 지나도 t2가 실행 된 후에는 작업을 신속하게 중지했다가 다시 시작합니다. 이상한 일이 발생합니다. 새 t1은 이전 t2가 종료 될 때까지 대기합니다. 이런 종류의 안드로이드에서 일어나는 이유

아무도 설명 할 수 왜 T1 내가 활동 A를 다시 시작한 후, 어떻게 T1이 활동 다시 시작 후 바로 시작할 수 있도록 즉시 시작하지 않는 이유는 무엇입니까?

내 테스트 코드는 두 번째 T2 내가 아주 신속하게 활동을 다시 시작하더라도 완료 후 나타나는 "httpget는 제한 시간이 3000이 시작",

private class MyAsyncTask extends AsyncTask<String, Integer, String> { 

    @Override 
    protected String doInBackground(String... params) { 
     httpget("http://www.baidu.com",3000); 
     httpget("http://www.baidu.com",30000); 
     return "test"; 
    } 

    protected void onCancelled() { 
     super.onCancelled(); 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    @Override 
    protected void onProgressUpdate(Integer... values) { 
     super.onProgressUpdate(values); 
    } 

} 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    new MyAsyncTask().execute("start"); 
} 

로그 결과는 다음과 같습니다이다. enter image description here

답변

2

3.0부터 AsyncTasks는 모두 단일 스레드에서 라운드 로빈을 실행합니다. Google은 앱 개발자가 동시 코드를 작성하기에는 너무 어리 석다고 생각했기 때문입니다. 실제로,이 사이트에 대한 질문은 그들이 그들이 옳다고 생각하게 만듭니다. 작업을 시작할 때 execute 대신 AsyncTask.executeOnExecutor()를 사용하여 해당 동작을 재정의 할 수 있습니다.

관련 문제