运行工作线程以定期更新UI的最佳实践

时间:2017-01-03 09:29:18

标签: android multithreading

在后台运行工作线程的最佳做法是定期更新活动中的UI元素。这里的目标是避免任何类型的更新屏幕冻结,以及是否应该遵循任何特定的指导方针/标准。

2 个答案:

答案 0 :(得分:2)

尝试后台工作服务。 我为你做了一个例子。

试试这个。

<强> 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);
    }
}

现在最后在AndroidManifest.xml文件中注册BackgroundService

<service android:name=".BackgroundService"/>

答案 1 :(得分:0)

使用AlarmManager(或其他一些计时器)定期启动服务。该服务然后更新模型,并通过例如LocalBroadcastManager通知UI线程。然后,UI线程可以使用BroadcastReceiver来捕获Intent并自行更新。