android 전달 - 안드로이드에서 ASyncTask 스레드를 중지하는 방법




단점 재사용 (3)

can anybody have any idea how to stop ASyncTask thread in android?.

사실 스레드를 생성하고 실행하는 루프가 있습니다. 이 루프가 끝날 때 나는 실행 한 모든 스레드를 중지하고 싶습니다. 어쨌든 스레드를 중지 할 수 있습니까?

고마워.


Answers

제 경우에는 HttpPost, HttpGet 등으로 서버 요청을 수행합니다. AsyncTask를 끝내기 위해 찾은 유일한 방법은 다음 예제에서 볼 수있는 abort () 메서드를 호출하는 것입니다.

if (isCancelled) {
     try {
         //cancel the task and immediately abort the HttpRequest
         uploadTask.cancel(true);
         post.abort();
     } catch (UnsupportedOperationException e) {
         e.printStackTrace();
     }
} 

AsyncTask 사용한 나의 경험에서 cancel(boolean mayInterruptIfRunning) 호출 cancel(boolean mayInterruptIfRunning) 반드시 백그라운드 프로세스의 실행이 중단되는 것은 아닙니다. 일어나는 모든 일은 AsyncTaskonCancelled() 실행하고 완료되면 onPostExecute() 실행 하지 않는다는 것 입니다. 이 동작은 아마도 doInBackgound() 에 어떤 코드가 있는지에 달려 있습니다.


스레드에 게시 된 모든 솔루션을 처리하는 데 2 ​​일 이상을 소비했으며 한 가지 방법으로 부족한 것으로 나타났습니다. 내 정확한 요구 사항은 100 % 신뢰도로 화면 키보드를 표시하거나 숨길 수있는 버튼을 갖는 것입니다. 키보드가 숨겨진 상태에있을 때 사용자가 클릭하는 입력 필드에 관계없이 다시 나타나서는 안됩니다. 그것이 보이는 상태에있을 때 키보드는 사용자가 어떤 버튼을 클릭하든 사라지지 않아야합니다. Android 2.2 이상에서 최신 기기까지 작동해야합니다.

내 애플 리케이션 깨끗한 RPN 에서 이것의 작동 구현을 볼 수 있습니다.

다양한 휴대 전화 (froyo 및 진저 브레드 기기 포함)에서 제안 된 답변 중 많은 부분을 테스트 한 결과 Android 앱을 안정적으로 사용할 수 있음이 분명해졌습니다.

  1. 일시적으로 키보드를 숨 깁니다. 사용자가 새 텍스트 필드에 포커스를 맞추면 다시 표시됩니다.
  2. 활동이 시작될 때 키보드를 표시하고 키보드가 항상 표시되어야한다는 것을 나타내는 활동에 플래그를 설정하십시오. 이 플래그는 활동이 초기화 될 때만 설정할 수 있습니다.
  3. 키보드를 사용하거나 사용하지 못하도록 활동을 표시하십시오. 이 플래그는 활동이 초기화 될 때만 설정할 수 있습니다.

나를 위해, 일시적으로 키보드를 숨기는 것만으로는 충분하지 않습니다. 일부 기기에서는 새 텍스트 필드에 초점을 맞추는 즉시 다시 표시됩니다. 내 응용 프로그램은 한 페이지에서 여러 텍스트 필드를 사용하므로 새 텍스트 필드에 초점을 맞추면 숨겨진 키보드가 다시 팝업됩니다.

안타깝게도 목록의 항목 2와 3은 작업이 시작될 때만 안정성을 작동합니다. 활동이 표시되면 키보드를 영구적으로 숨기거나 표시 할 수 없습니다. 트릭은 사용자가 키보드 토글 버튼을 누를 때 실제로 활동을 다시 시작하는 것입니다. 사용자가 토글 키보드 버튼을 누르면 내 앱에서 다음 코드가 실행됩니다.

private void toggleKeyboard(){

    if(keypadPager.getVisibility() == View.VISIBLE){
        Intent i = new Intent(this, MainActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        Bundle state = new Bundle();
        onSaveInstanceState(state);
        state.putBoolean(SHOW_KEYBOARD, true);
        i.putExtras(state);

        startActivity(i);
    }
    else{
        Intent i = new Intent(this, MainActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        Bundle state = new Bundle();
        onSaveInstanceState(state);
        state.putBoolean(SHOW_KEYBOARD, false);
        i.putExtras(state);

        startActivity(i);
    }
}

이렇게하면 현재 액티비티의 상태가 Bundle에 저장되고 액티비티가 시작되어 키보드를 표시할지 또는 숨길지를 나타내는 부울 값을 전달합니다.

onCreate 메소드 내에서 다음 코드가 실행됩니다.

if(bundle.getBoolean(SHOW_KEYBOARD)){
    ((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(newEquationText,0);
    getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
else{
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
            WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
}

소프트 키보드가 표시되어야하는 경우 InputMethodManager에 키보드가 표시되고 소프트 입력이 항상 표시되도록 창이 표시됩니다. 소프트 키보드가 숨겨져 있으면 WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM이 설정됩니다.

이 접근법은 안드로이드 2.2를 실행하는 4 년 된 HTC 전화에서 4.2.2를 실행하는 넥서스 7까지 테스트 한 모든 장치에서 안정적으로 작동합니다. 이 방법의 단점은 뒤로 버튼을 조심스럽게 처리해야한다는 것입니다. 내 앱은 기본적으로 하나의 화면 (계산기) 만 가지고 있기 때문에 onBackPressed ()를 재정의하고 장치 홈 화면으로 돌아갈 수 있습니다.





android multithreading android-asynctask