java 인터넷 - 안드로이드-AsyncTask에 대한 시간 초과 설정?





android method (7)


하나의 조건을 추가하여 취소를 더욱 강력하게 만들 수 있습니다. 예를 들어,

 if (downloader.getStatus() == AsyncTask.Status.RUNNING || downloader.getStatus() == AsyncTask.Status.PENDING)
     downloader.cancel(true);

웹 사이트에서 데이터의 큰 목록을 다운로드하는 AsyncTask 클래스가 있습니다.

최종 사용자가 사용 중에 매우 느리게 또는 반점이있는 데이터 연결이있는 경우, 일정 시간이 지나면 AsyncTask 시간 초과를 만들고 싶습니다. 내 첫 번째 접근 방식은 이렇게 같습니다 :

MyDownloader downloader = new MyDownloader();
downloader.execute();
Handler handler = new Handler();
handler.postDelayed(new Runnable()
{
  @Override
  public void run() {
      if ( downloader.getStatus() == AsyncTask.Status.RUNNING )
          downloader.cancel(true);
  }
}, 30000 );

AsyncTask 시작한 후에 AsyncTask 가 여전히 실행중인 경우 30 초 후에 AsyncTask 를 취소하는 새 처리기가 시작됩니다.

이것은 좋은 접근 방법입니까? 또는이 목적에 더 적합한 AsyncTask 내장 된 것이 있습니까?




이 경우 다운로더는 URL 연결을 기반으로하며, 복잡한 코드없이 타임 아웃을 정의하는 데 도움이되는 많은 매개 변수가 있습니다.

  HttpURLConnection urlc = (HttpURLConnection) url.openConnection();

  urlc.setConnectTimeout(15000);

  urlc.setReadTimeout(15000);

이 코드를 비동기식 작업으로 가져 오면 괜찮습니다.

'Read Timeout'은 모든 전송을 통해 나쁜 네트워크를 테스트하는 것입니다.

'연결 시간 초과'는 서버가 가동 중인지 여부를 테스트하기 위해 처음에 호출됩니다.




AsyncTask에 내장 된 것과 같은 것이 없다고 생각합니다. 귀하의 접근 방식은 좋은 것으로 보입니다. AsyncTask의 doInBackground 메소드에서 isCancelled ()의 값을 주기적으로 확인하여 UI 스레드가 취소하면이 메소드를 종료하십시오.

어떤 이유로 든 처리기를 사용하지 않으려면 AsyncTask에서 System.currentTimeMillis를 주기적으로 확인하고 시간 초과시 종료 할 수 있습니다. 실제로 스레드를 인터럽트 할 수 있기 때문에 솔루션을 더 좋아합니다.




질문에서 영감을 얻으려면 AsyncTask를 통해 백그라운드 작업을 수행하는 메서드를 작성했으며 처리하는 데 LOADING_TIMEOUT 이상 소요되면 다시 시도하라는 경고 대화 상자가 나타납니다.

public void loadData()
    {
        final Load loadUserList=new Load();
        loadUserList.execute();
        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                if (loadUserList.getStatus() == AsyncTask.Status.RUNNING) {
                    loadUserList.cancel(true);
                    pDialog.cancel();
                    new AlertDialog.Builder(UserList.this)
                            .setTitle("Error..!")
                            .setMessage("Sorry you dont have proper net connectivity..!\nCheck your internet settings or retry.")
                            .setCancelable(false)
                            .setPositiveButton("Retry", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i) {
                                    loadData();
                                }
                            })
                            .setNegativeButton("Exit", new DialogInterface.OnClickListener() {
                                @Override


                      public void onClick(DialogInterface dialogInterface, int i) {
                                System.exit(0);
                            }
                        })
                        .show();
            }
        }
    }, LOADING_TIMEOUT);
    return;
}



예, AsyncTask.get()

myDownloader.get(30000, TimeUnit.MILLISECONDS);

주 스레드 (일명 UI 스레드)에서 이것을 호출하면 실행이 차단되므로 별도의 스레드에서 호출해야 할 수도 있습니다.




         Context mContext;

         @Override
         protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
                                    mContext = this;

            //async task
            final RunTask tsk = new RunTask (); 
            tsk.execute();

            //setting timeout thread for async task
            Thread thread1 = new Thread(){
            public void run(){
                try {
                    tsk.get(30000, TimeUnit.MILLISECONDS);  //set time in milisecond(in this timeout is 30 seconds

                } catch (Exception e) {
                    tsk.cancel(true);                           
                    ((Activity) mContext).runOnUiThread(new Runnable()
                    {
                         @SuppressLint("ShowToast")
                        public void run()
                         {
                            Toast.makeText(mContext, "Time Out.", Toast.LENGTH_LONG).show();
                            finish(); //will close the current activity comment if you don't want to close current activity.                                
                         }
                    });
                }
            }
        };
        thread1.start();

         }



배경 작업을 위해이 라이브러리를 사용하여 더 쉽게 삶을 살도록 권하고 싶습니다. https://github.com/Arasthel/AsyncJobLibrary

그것의 간단한이 ..

AsyncJob.doInBackground(new AsyncJob.OnBackgroundJob() {

    @Override
    public void doOnBackground() {
        startRecording();
    }
});






java android android-asynctask