[英]Access from AsyncTask to Application Class or any other Global variables from any Classes
我无法从AsyncTask访问应用程序类,也无法使用具有最近更新的数据的SharedPreferences发出问题,等等。
基本上我需要Global变量的原因是跟踪当前活动的活动 ,并且应该可以从任何类型的类(例如Activity , AsyncTask , Service , Receiver , Application ,Etc等)访问它。
我知道这里有很多问题,但没有一个对我有帮助。
我尝试了几种方法来做到这一点,但是找不到任何真正的解决方案。
使用SharedPreferences ,我可以使用它,但是在更新和读取首选项后,返回先前的值,仅在重新启动应用程序后才有效。
使用Application Class时 ,运气不好,无法从AsyncTask和服务访问Application
服务每5秒运行一次AsyncTask ,AsyncTask应该知道MainActivity是否已打开并正在运行,以便它可以更新其内容。
我几乎可以完成所有工作,但与此同时,我花了太多时间进行搜索。
因此,如果有人可以帮助我,那就太好了。 :)
这是我的小例子。
MainActivity.java
public class MainActivity extends Activity {
private boolean active = false;
SharedPreferences prefs;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
this.prefs = context.getSharedPreferences("com.my.app", Context.MODE_PRIVATE);
storeActivity("MainActivity");
this.active = true;
((App) this.getApplication()).setTopActivity("MainActivity");
}
public void storeActivity(String TOP_ACTIVITY) {
SharedPreferences.Editor editor = prefs.edit();
editor.putString("TOP_ACTIVITY", TOP_ACTIVITY);
editor.apply();
editor.commit();
}
@Override
public void onResume() {
super.onResume();
((App) this.getApplication()).setTopActivity("MainActivity");
this.active = true;
storeActivity("MainActivity");
}
@Override
public void onPause() {
super.onPause();
((App) this.getApplication()).setTopActivity("");
this.active = false;
storeActivity("");
}
@Override
public void onStart() {
super.onStart();
((App) this.getApplication()).setTopActivity(ACTIVITY_NAME);
this.active = true;
storeActivity("MainActivity");
}
@Override
public void onStop() {
super.onStop();
((App) this.getApplication()).setTopActivity("");
this.active = false;
storeActivity("");
}
}
这是我的应用程序对象,
App.java
public class App extends Application {
private String TOP_ACTIVITY;
public String getTopActivity() {
return TOP_ACTIVITY;
}
public void setTopActivity(String CURRENT_ACTIVITY) {
this.TOP_ACTIVITY = CURRENT_ACTIVITY;
}
public static Application getApplication() {
return new App();
}
}
这是一些AsyncTask从服务器获取信息
套接字
public class SocketUpdater extends AsyncTask<String,Void,String> {
private Context context;
private SharedPreferences prefs;
public SocketUpdater(Context context) {
this.context = context;
this.prefs = context.getSharedPreferences("com.my.app", Context.MODE_PRIVATE);
}
@Override
protected String doInBackground(String... arg0) {
StringBuffer result = new StringBuffer("");
return new String(result);
}
@Override
protected void onPostExecute(String result) {
Toast.makeText(context, "RESULT: " + result, Toast.LENGTH_SHORT).show();
String TOP_ACTIVITY = ((App) this.getApplication()).getTopActivity();
// THIS CANT WORK, NO this.getApplication()!!!
boolean MainActivityActive = MainActivity.active;
// THIS RETURNS ME FALSE ALL THE TIME
SharedPreferences.Editor editor = prefs.edit();
String PREF_TOP_ACTIVITY = prefs.getString("TOP_ACTIVITY", "");
if(MainActivityActive) {
Toast.makeText(context, "NEVER FIRES!", Toast.LENGTH_LONG).show();
}
if(TOP_ACTIVITY.equals("MainActivity")) {
Toast.makeText(context, "NEVER FIRES!", Toast.LENGTH_LONG).show();
}
if(PREF_TOP_ACTIVITY.equals("MainActivity")) {
Toast.makeText(context, "NEVER FIRES!", Toast.LENGTH_LONG).show();
}
}
}
为什么不使用Square的“ Otto”库? 您可以在活动和服务之间轻松发送对象。 我在应用程序中出于类似目的使用它。
我花了几天时间寻找导致问题的原因。
我为此找到了简单的解决方案,并使所有方法都能按我的意愿工作。
问题是我让我的服务运行自己的独立进程,如下所示:
<service android:name="fi.hgs.apps.MyService"
android:process=":myService"
</service>
并刚刚从AndroidManifest.xml中删除了android:process =“:myService”
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.