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