2016-08-15 5 views
0

私は、ユーザーが特定のことをした後にログファイルを私に返すアンドロイドタブレット上のアプリケーションを持っています。私はAsyncTaskで作成しているログファイルを送ることができるように、すでにセットアップを行っていました。ログファイルがますます大きくなるにつれ、送信に時​​間がかかり、最初のログファイルが終了する前に別のログファイルの送信を開始する問題が発生し始めています。前の1つが終了するまで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 
    } 
} 

1現在実行している場合、私は新しいSendLogFile AsyncTaskを実行しないようにするために方法はありますか?私はタイマーで定期的な仕事としてそれを設定したくない、私はまだそれがユーザーの行動を開始したい。

ありがとうございました。

+1

または、何らかのフラグを使用してください。私はあなたが2つ以上のタスクを防止したい場合、これはUIロジックで行うべきだと思います。 –

+0

@EliDvenven絶対に間違った場所。 UIロジックは、タスクを一度に1回だけ実行する必要があることを知っていますか? –

答えて

2

ここでボトルネックが発生していることがわかりました。ログファイルが大きくなってしまって困っている場合、あなたのアプローチは間違っています。ログ全体を送信せず、差分を送信してください。

これを無視して、私はAsyncTaskを使用しません。私はスレッドを使用します。スレッドは周りに座って、ログメッセージを送るのを待ちます。 1つを取得すると、それを送信します。その唯一のスレッド送信ログは、一度に2つを送信することはできません。

+0

私はボトルネックに同意しますが、私は物事のサーバー側にアクセスすることはできず、現行ファイルに追加するのではなく、現在ファイルを置き換えることができます。それが変化すれば、私の人生はずっと楽になります、私は同意します。私はちょうどスレッドを使用して見てみましょう。すべてのスレッドはまだ私にとっては少し新しいです:)。ありがとう – 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の回答からは、差分を送ることができれば素晴らしいでしょう。サーバ。可能でない場合は、デバイスのファイルの現在のチェックサムを保存することができます。ログに変更がなければ、少なくとも をアップロードする時間を節約できます。

ここでは、asynctaskを置き換えるためのチュートリアルがあります。 http://blog.stablekernel.com/replace-asynctask-asynctaskloader-rx-observable-rxjava-android-patterns/

関連する問題