2016-08-15 3 views
0

사용자가 특정 작업을 수행 한 후에 로그 파일을 나에게 보내는 안드로이드 타블렛에 응용 프로그램이 있습니다. AsyncTask에서 작성중인 로그 파일을 보낼 수 있도록 설정이 이미되어 있습니다. 로그 파일의 크기가 커지면 전송하는 데 시간이 오래 걸리며 처음 로그 파일이 완료되기 전에 다른 로그 파일을 보내는 문제가 발생하기 시작합니다.이전 작업이 완료 될 때까지 AsyncTask를 기다려야합니다.

코드는 단순히 간단한

new SendLogFile().execute(); 

으로 호출되는

private class SendLogFile extends AsyncTask<Void, Void, Void> { 
    @Override 
    protected Void doInBackground(Void... params) { 
     //Send Log File From Tablet to Server 
    } 
} 

하나 현재 실행중인있을 경우 나 새로운 SendLogFile AsyncTask를 실행하지 않도록하기위한 방법이 있나요입니까? 타이머를 사용하여 반복 작업으로 설정하고 싶지는 않지만 여전히 사용자 작업을 시작하고 싶습니다.

감사합니다.

+1

깃발을 사용하십시오. 두 개 이상의 작업을 방지하려면 UI 로직에서이 작업을 수행해야합니다. –

+0

@ 엘리 디븐더 틀린 장소. UI 로직은 한 번에 한 번만 태스크를 실행해야한다는 것을 알고 있습니까? –

답변

2

여기서 병목 현상이 발생하고 있다는 것을 알고 계실 겁니다. 로그 파일이 커짐에 따라 문제가 발생하면 접근 방법이 잘못되었습니다. 전체 로그를 보내지 말고, diff 파일을 보내십시오.

무시한 - 나는 비동기 태스크를 사용하지 않을 것이다. 나는 쓰레드를 사용할 것이다. 스레드가 주변에 앉아서 로그 보내기 메시지를 기다립니다. 그것이 하나가되면 그것을 보냅니다. 로그를 보내는 유일한 스레드가 한 번에 두 개를 보낼 수 없기 때문에.

+0

병 목에 동의하지만 서버 측에 대한 액세스 권한이 없으며 현재 현재 파일에 추가하는 대신 파일을 바꿀 수 있습니다. 그렇게되면 내 인생이 훨씬 쉬워집니다. 나는 단지 쓰레드 (Thread)를 사용하는 것을 살펴볼 것이다. 모든 스레딩은 나에게 조금 새로운 것이기도합니다. :) 감사 – jhnewkirk

0

크기가 1 인 ThreadPoolExecutor을 사용할 수 있으며 작업을 제출하십시오. 하나씩 실행합니다.

0

이 문제에 대한 간단한 해결책이있다가, 의도 서비스를 사용합니다. 원하는만큼 실행할 수 있으며 자동으로 qeue를 생성하고 명령이 남아있을 때까지 차례대로 실행합니다. 문제가 해결되면 작성한이 클래스를 사용하십시오.

public class FeedBackSyncCommand extends IntentService { 

    public static final String ARG_LOG_FILE = "Log"; 

    /** 
    * Creates an IntentService. Invoked by your subclass's constructor. 
    * 
    * @param name Used to name the worker thread, important only for debugging. 
    */ 
    public FeedBackSyncCommand(String name) { 
     super(name); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     String logFile = intent != null ? 
       intent.getStringExtra(ARG_LOG_FILE) : 
       "Log not available"; 

     // do stuff with your log file 
    } 
} 

그리고 당신은 그것을 (서비스의 10 개 인스턴스를 시작하는)이 방법을 사용할 수는 :

Intent feedBackCommand = 
       new Intent(getApplicationContext(), FeedBackSyncCommand.class); 

    for (int i = 0; i < 11; i ++) { 
     feedBackCommand.removeExtra(FeedBackSyncCommand.ARG_LOG_FILE); 
     feedBackCommand.putExtra(FeedBackSyncCommand.ARG_LOG_FILE, 
       "This is an example log file" + 1); 
     getApplicationContext().startService(feedBackCommand); 
    } 
0

나는 논리의 흐름이 더 진보하고 복잡하기 때문에 그것이 가능하다면 RxJava를 사용하도록 제안 미래. 그리고 작업을 위해 별도의 스레드가 필요합니다. 난 당신을 위해 조각/작업 (MVC 패턴에서보기와 컨트롤러 사이의 영역에 있음)에 대한 일부 논리를 포함해야한다고 생각합니다.

Gabe Sechan의 답변에서 diff를 보낼 수 있다면 좋을 것입니다. 섬기는 사람. 가능하지 않은 경우 장치의 파일의 현재 체크섬을 저장할 수 있습니다. 적어도 로그에 변경 사항이없는 경우 업로드 시간을 절약 할 수 있습니다.

자습서는 asynctask를 대체하기위한 것입니다. http://blog.stablekernel.com/replace-asynctask-asynctaskloader-rx-observable-rxjava-android-patterns/

관련 문제