Java 在Android中如何将服务对象传递给子类?
我正在开发一个应用程序,它从网络上获取数据并将其写回网络。为此,我使用了AsyncTask,但这些请求并没有得到优化,所以我必须在每个请求上对用户进行身份验证。现在,我想使用服务来保持与后端的连接,并执行请求,而无需在每个请求上对用户进行身份验证 如果不创建一个新实例,并且不清空服务中需要的所有值,我就很难将此服务对象发送到subactivity。那么,如何在不使用osing值的情况下实现呢 这是我的服务:Java 在Android中如何将服务对象传递给子类?,java,android,Java,Android,我正在开发一个应用程序,它从网络上获取数据并将其写回网络。为此,我使用了AsyncTask,但这些请求并没有得到优化,所以我必须在每个请求上对用户进行身份验证。现在,我想使用服务来保持与后端的连接,并执行请求,而无需在每个请求上对用户进行身份验证 如果不创建一个新实例,并且不清空服务中需要的所有值,我就很难将此服务对象发送到subactivity。那么,如何在不使用osing值的情况下实现呢 这是我的服务: public class LasteMVService extends Service
public class LasteMVService extends Service {
private ArrayList<WorkSheet> workSheetArrayList;
private SpreadSheet selectedSpeadSheet;
private static String LOG_TAG = "LasteMVService";
private IBinder mBinder = new MyBinder();
@Override
public void onCreate() {
super.onCreate();
new Thread(new Task()).start();
Log.v(LOG_TAG, "in onCreate");
}
@Override
public IBinder onBind(Intent intent) {
Log.v(LOG_TAG, "in onBind");
return mBinder;
}
@Override
public void onRebind(Intent intent) {
Log.v(LOG_TAG, "in onRebind");
super.onRebind(intent);
}
public SpreadSheet getSelectedSpeadSheet() {
return selectedSpeadSheet;
}
public ArrayList<WorkSheet> getWorkSheetArrayList() {
return workSheetArrayList;
}
@Override
public void onDestroy() {
Log.v(LOG_TAG, "in onDestroy");
super.onDestroy();
}
public class MyBinder extends Binder {
public LasteMVService getService() {
return LasteMVService.this;
}
}
class Task implements Runnable {
@Override
public void run() {
synchronized (this){
AndroidAuthenticator androidAuthenticator = new AndroidAuthenticator(getApplicationContext());
SpreadSheetFactory spf = SpreadSheetFactory.getInstance(androidAuthenticator);
ArrayList<SpreadSheet> sheets = spf.getSpreadSheet("Stardiprotokoll", true);
if (sheets != null) {
final SpreadSheet spreadSheet = sheets.get(0);
selectedSpeadSheet = spreadSheet;
ArrayList<WorkSheet> workSheet = spreadSheet.getAllWorkSheets();
workSheetArrayList = workSheet;
}
}
}
}
}
我的问题是如何在BaseActivity的一些子活动中获得相同的服务实例?好的,因此您需要一个服务对象,从BaseActivity获取对象的引用,而不是创建一个在整个应用程序中全局可访问的单例类。。 下面是帮助您的源代码
public class Common extends Application {
private Service mService; //Service Object from your class that extends service.
private Context mContext;
public Service getService(){
return mService;
}
public void setService(Service service){
mService = service;
}
@Override
public void onCreate() {
super.onCreate();
//Gets the context associated with the whole application
mContext = getApplicationContext();
}
}
public class Service extends Service{
private Common mApp;
private Context mContext;
//Instantiate the Common Object from the singleton class within on create.
@Override
public void onCreate() {
super.onCreate();
mContext = getApplicationContext();
mApp = (Common) getApplicationContext();
mApp.setService(this);
}
}
//Now to use it in your base Activity
public class BaseActivity extends AppCompatActivity{
private Common mApp;
private Service mService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mApp = (Common) mContext.getApplicationContext();
//To use the service you would simply use:
mService = mApp.getService()./*Some public method defined in your service*/;
}
}
谢谢,这解决了我的服务对象问题,但现在我遇到了networkOnMainThread问题。希望能解决这个问题。也能解决这些问题,但我无法通过身份验证,所以每个请求大约需要5秒钟才能完成。我想这是因为我使用lib与后端通信
public class Common extends Application {
private Service mService; //Service Object from your class that extends service.
private Context mContext;
public Service getService(){
return mService;
}
public void setService(Service service){
mService = service;
}
@Override
public void onCreate() {
super.onCreate();
//Gets the context associated with the whole application
mContext = getApplicationContext();
}
}
public class Service extends Service{
private Common mApp;
private Context mContext;
//Instantiate the Common Object from the singleton class within on create.
@Override
public void onCreate() {
super.onCreate();
mContext = getApplicationContext();
mApp = (Common) getApplicationContext();
mApp.setService(this);
}
}
//Now to use it in your base Activity
public class BaseActivity extends AppCompatActivity{
private Common mApp;
private Service mService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mApp = (Common) mContext.getApplicationContext();
//To use the service you would simply use:
mService = mApp.getService()./*Some public method defined in your service*/;
}
}