繁体   English   中英

从AsyncTask访问应用程序类或任何类中的任何其他全局变量

[英]Access from AsyncTask to Application Class or any other Global variables from any Classes

我无法从AsyncTask访问应用程序类,也无法使用具有最近更新的数据的SharedPreferences发出问题,等等。

基本上我需要Global变量的原因是跟踪当前活动的活动 ,并且应该可以从任何类型的类(例如ActivityAsyncTaskServiceReceiverApplication ,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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM