2017-01-03 8 views
2

アクティビティのUI要素を定期的に更新するワーカースレッドをバックグラウンドで実行するためのベストプラクティスは何ですか?ここでの目標は、あらゆる種類のアップデートでスクリーンがフリーズするのを避けることと、それに続く特定のガイドライン/標準がある場合は避けることです。定期的にUIを更新するためのワーカースレッドを実行するためのベストプラクティス

+0

androidのLocalboadcastManagerでインテントサービスを使用する –

答えて

1

バックグラウンド作業のサービスをお試しください。 私はあなたのための例を作った。

これを試してください。

TestActivity.java

public class TestActivity extends AppCompatActivity { 

    private final String TAG = "TestActivity"; 
    public final static String RECEIVER_ACTION = "com.action.MyReceiverAction"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.test_work); 

     registerMyReceiver(); 

     startService(new Intent(this, BackgroundService.class)); 


    } 


    MyReceiver myReceiver = new MyReceiver(); 
    private void registerMyReceiver() { 


     IntentFilter intentFilter = new IntentFilter(); 
     intentFilter.addAction(RECEIVER_ACTION); 

     registerReceiver(myReceiver, intentFilter); 
    } 

    class MyReceiver extends BroadcastReceiver 
    { 

     @Override 
     public void onReceive(Context context, Intent intent) { 

      Log.e(TAG, "onReceive() called"); 
     } 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     unregisterReceiver(myReceiver); 
    } 
} 

BackgroundService.java

public class BackgroundService extends Service { 


    private String TAG = "BackgroundService"; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     Log.e(TAG, "onCreate() called"); 
    } 

    @Nullable 
    @Override 
    public IBinder onBind(Intent intent) { 

     Log.e(TAG, "onBind() called"); 

     return null; 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     Log.e(TAG, "onStartCommand() called"); 

     notifyToUI(); 

    return super.onStartCommand(intent, flags, startId); 
    } 

    /** 
    * This Methd will notify your Activity 
    */ 
    private void notifyToUI() 
    { 
     Intent myIntent = new Intent(); 
     myIntent.setAction(TestActivity.RECEIVER_ACTION); 
     sendBroadcast(myIntent); 
    } 
} 

終わり

<service android:name=".BackgroundService"/> 
ファイルのAndroidManifest.xmlでBackgroundServiceを登録
+0

サンプルコードありがとうございます。これは動作しますが、デフォルトのパワーマネージャを搭載したSamsungデバイスでは、15分程度でクラッシュするようです。パワーマネージャーがバックグラウンドサービスを抹殺するのを防ぐ方法はありますか? – Zishan

+0

あなたのクラッシュログを教えてください。正確な問題を知ることは役に立ちます。 –

0

AlarmManager(または他のタイマー)を使用して定期的にサービスを開始します。そのサービスはモデルを更新し、例えばLocalBroadcastManagerでUIスレッドに通知します。 UIスレッドは、BroadcastReceiverを使用してIntentを捕捉し、自身を更新することができます。

関連する問題