2017-07-06 5 views
2

ViewPagerにロードされたフラグメントがあります。この場合、各 "ページ"はカーソルの行からロードされます。各断片は、装置上の画像(JPEG)を示す。ユーザーがフラグメントを却下した場合(つまり、スワイプ/ページの変更、ヒット/アップ、またはアプリケーションを完全に閉じる)、書き込み用にJPEGファイルを開き、そのメタデータの更新を行うメソッドを呼び出す必要があります。実際の作業は、最終的にApache Commons Imagingライブラリによって処理されます。フラグメントonStopはUIスレッドで実行されます

私はこれを、各フラグメントのライフサイクルonStop()ハンドラから私のsaveToFile()メソッドを呼び出すことによって実装しました。 これは、ファイル操作全体がUIスレッド上で実行されることを意味しますか?このために私は間違いなくAsyncTaskを設定する必要がありますか?

何らかの理由でファイルが書き込まれた(いくつかのJPEGのために)長い時間(2分など)が必要です。何が起こるでしょうか? UIは再開する前にこのページ/フラグメントで待機(フリーズ)しますか?あるいは、プロセス(ファイルへの書き込み)は何とか「バックグラウンドで」続けますか?あるいは、プロセスはちょうど殺され、プロセスの途中で止まったでしょうか?

私は現在このワイヤード(onStopsaveToFile()を呼び出して、イメージングライブラリを呼び出してファイルを更新する)の方法はうまくいくと思われます。私はアプリを終了しても、私はまだトーストのテキストが "ファイルへの書き込み"とポップアップしているのを見ています。プロセスは決して邪魔されず、私はUIの遅れを経験しているとは言えません。

+0

はいアクティビティとフラグメントのすべてのライフサイクルメソッドはメインスレッド(別名UIスレッド)で実行されます。これらの方法でビューを再生できることで確認できます。 – Sufian

答えて

2

onStop()ハンドラ。これは、ファイル操作全体が のUIスレッドで実行されることを意味しますか?私は間違いなく のAsyncTaskを設定する必要がありますか?別のスレッドで実行し、実際には、ありませんdoInBackground方法、およびUIスレッド上で実行されますonPostExecute方法:

YES

アンAsyncTaskは、いくつかの部分を持っています。

EventBusなどのような種類のオブザーバパターンを使用して、非同期を実行して結果をUIに送信することもできます。


は 、例えば2分に長い時間を取る必要があります(一部のJPEGのために)突然何らかの理由でファイル書き込みを言います。何が起こるでしょうか? UIが ちょうど待っている(フリーズ)

Androidは、ANR(Application Not Responding)のために強制的に閉じるため、アプリケーションがクラッシュすることがあります。

は、この詳細については、公式ドキュメントを参照してください:https://developer.android.com/training/articles/perf-anr.html

Androidアプリケーションは、通常は「UIスレッド」または「メインスレッド」)をデフォルト によって単一のスレッド上で完全に実行します。これは、 アプリケーションがUIスレッドで行っていることを意味し、 に完了するまでに時間がかかると、アプリケーションが 入力イベントまたはインテントブロードキャストを処理する機会を与えないため、ANRダイアログがトリガーされる可能性があります。

したがって、UIスレッドで実行されるすべてのメソッドは、そのスレッドでできるだけ小さい数字の を実行する必要があります。特に、アクティビティは、 onCreate()やonResume()などの主要なライフサイクルメソッドにできるだけ少ない設定で を実行する必要があります。 ネットワークやデータベース操作などの潜在的に長時間実行される操作、またはビットマップのサイズ変更など計算上高価な 計算は、ワーカー スレッド(またはデータベース操作の場合は非同期 要求)で実行する必要があります。

より長い操作のためのワーカースレッドを作成する最も効果的な方法は、AsyncTaskクラスを使用しています。

ここに私が推奨するものがあります。上記のEventBusを使用してonClose()のデータを自動的に保存するBaseActivityを作成し、Asyncを実行するイベントを発生させます。その後、自動保存機能が必要なすべての場所でその基本アクティビティを拡張します。

ここでは、EventBusを使用する例を示します。

public abstract class BaseActivity extends Activity{ 

@Override 
protected void onResume(){ 
    if(!EventBus.getDefault().isRegistered(this)) 
     EventBus.getDefault().register(this); 
    super.onResume(); 
} 

@Override 
protected void onDestroy() { 
    if(EventBus.getDefault().isRegistered(this)) 
    EventBus.getDefault().unregister(this); 
    super.onDestroy(); 
} 

@Override 
protected void onStop() { 
    super.onStop(); 
    //We fire event and pass the current parent class that inherited this base. 
    EventBus.getDefault().post(new EventBusProcessMySaveData(this.getClass())); 
} 
} 

//Your model class to use with EventBus 
public final class EventBusProcessMySaveData{ 
    private final Class className; 

    public EventBusProcessMySaveData(final Class className){ 
     this.className = className; 
    } 

    public Class getClassName(){ 
     return this.className; 
    } 
} 


public class MyMainActivity extends BaseActivity{ 
    //Do you standard setup here onCreate() and such... 

    //Handle Event for Saving Operation, async. 
    //This will fire everytime theres an onClose() IN ANY activity that 
    //extends BaseActivity, but will only process if the class names match. 
    @Subscribe(threadMode = ThreadMode.ASYNC) 
    public void methodNameDoesNotReallyMatterHere(final EventBusProcessMySaveData model){ 
     //We make sure this is the intended receiving end by comparing current class name 
     //with received class name. 
     if(model.getClassName().equals(this.getClass())){ 
      //Do whatever you need to do that's CPUintensive here. 
     } 
    } 

} 
+0

よろしくお願いいたします。ただし、AsyncTaskは、「GUIに更新をもたらす長期実行タスクを実行する」クラスとして記述されています。私の場合、ユーザーが実際にUIを終了した後、バックグラウンドでファイルを更新したいだけです。タスクがUIで変更を生成しない場合、AsyncTaskまたは他の「ワーカースレッド」を使用する必要がありますか? – joakimk

+0

"タスクがUIで変更を生成しない場合は、AsyncTaskや他の"ワーカースレッド "を使用する必要がありますか?" - UIと話す必要がない場合は、新しいバックグラウンドスレッドをスピンアップするか、ワーカースレッド。再びdocsを参照してください - https://developer.android.com/guide/components/processes-and-threads.html – Dayan

+0

はい、もう一度ありがとうございます!それは私が必要なもののように聞こえる。 – joakimk

関連する問題