我的应用程序中有一些类需要调用需要Context作为参数的Android函数.我没有它,因为类不是Activity类的子类.
解决这个问题的正确方法是什么?
我知道在Android上使用静态变量是非常危险的,特别是如果你将它们引用到活动中.但是,如果我有一个扩展Application的类(让我们称这个类为"App"),引用这个类的实例是否安全?
如果是这样,任何其他类是否也可以安全地对应用程序上下文进行任何类型的引用?我的意思是,如果我在任何类中引用应用程序上下文,是否会出现内存泄漏?
目的是无论我在哪个范围内,我总能得到对应用程序上下文的引用.我认为这是安全的,因为如果系统关闭了应用程序,静态变量也会消失,直到下次应用程序再次启动时,这将再次初始化静态变量.
此外,并不重要,但如果我使用多个进程,我会在每个进程上获得完全不同的App类引用吗?
作为代码的一个例子,这是我在想的:
public class App extends Application
{
private static Context _appContext;
@Override
public void onCreate()
{
super.onCreate();
_appContext = this;
}
public static Context getAppContext()
{
return _appContext;
}
}
Run Code Online (Sandbox Code Playgroud) 我试图在我的Android应用程序中实现MVVM模式.我已经读过ViewModels不应该包含任何特定于Android的代码(以使测试更容易),但是我需要使用上下文来处理各种事情(从xml获取资源,初始化首选项等).做这个的最好方式是什么?我看到它AndroidViewModel有一个对应用程序上下文的引用,但是它包含特定于android的代码,因此我不确定它是否应该在ViewModel中.这些也与Activity生命周期事件有关,但我使用匕首来管理组件的范围,所以我不确定这会如何影响它.我是MVVM模式和Dagger的新手,所以任何帮助都表示赞赏!
我GOOGLE了这个问题很多,已经发现,当使用许多不同的建议getBaseContext,getApplicationContext或活动本身的这个指针.
经常出现并且似乎很有意义的三条规则是 -
假设这些是正确的,getBaseContext有什么用?
我见过许多使用以下方法创建新意图的例子 -
Intent intent = new Intent(getBaseContext(), myClass.class);
Run Code Online (Sandbox Code Playgroud)
与 - 相反 -
Intent intent = new Intent(this, myClass.class);
Run Code Online (Sandbox Code Playgroud)
哪个是正确的或推荐的方法,为什么?
我有TextView显示时间.我想使用Android的DataBinding插件.对于格式化时间,我使用DateUtils.formatDateTime(context,int,int)方法,该方法接受Context实例.是否可以获取上下文包含元素?或者我必须使用旧学校的方式?
谢谢
我正在尝试为Android-App创建一个ProgressDialog(只是一个简单的显示用户正在发生的东西,没有按钮或任何东西),但我无法正确.我一直在浏览论坛和教程以及SDK附带的示例代码,但无济于事.
这就是我得到的:
btnSubmit.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
(...)
ProgressDialog pd = new ProgressDialog(MyApp.this);
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.setMessage("Working...");
pd.setIndeterminate(true);
pd.setCancelable(false);
// now fetch the results
(...long time calculations here...)
// remove progress dialog
pd.dismiss();
Run Code Online (Sandbox Code Playgroud)
我也试过添加pd.show();和搞乱参数,new ProgressDialog导致什么都没有(除了所选参数不起作用的错误),这意味着:ProgressDialog永远不会出现.应用程序只是保持运行,就好像我从未添加过对话框一样.
我不知道我是否在正确的地方创建了对话框,我把它移动了一下但是,这也没有帮助.也许我在错误的背景下?上面的代码是内部private ViewGroup _createInputForm()在MyApp.
任何提示都表示赞赏,
在我的android项目中,我有ImageAdapter类,我在其中传递应用程序上下文以满足其他需求.
public class ImageAdapter extends BaseAdapter {
private Context c;
public ImageAdapter(Context c) {
this.c = c;
}
...
}
Run Code Online (Sandbox Code Playgroud)
问题是我想让ImageAdapter成为一个单例,以便从我的所有活动中轻松访问这个类的实例.但是我不知道如何将getApplicationContext()方法中的app context从我的一个活动传递给ImageAdapter.所以有没有"神奇"做到这一点如下?
public class ImageAdapter extends BaseAdapter {
private Context c;
private static class Holder {
public static final ImageAdapter IA = new ImageAdapter();
}
private ImageAdapter() {
this.c = /* some magic here */.getApplicationContext();
}
public static ImageAdapter getInstance() {
return Holder.IA;
}
...
}
Run Code Online (Sandbox Code Playgroud)
也许你有一些其他的想法,可以为我的任何活动分享ImageAdapter.我是android的新手,我对在活动中传递数据的方式有点困惑.
我将不胜感激任何帮助.
在我正在进行的学习过程中(这次是对话框),我发现这有效:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
Run Code Online (Sandbox Code Playgroud)
虽然以下方法不起作用(运行时因WindowManager $ BadTokenException而失败):
AlertDialog.Builder builder = new AlertDialog.Builder(this.getApplicationContext());
Run Code Online (Sandbox Code Playgroud)
我不明白为什么,因为AlertDialog.Builder 的构造函数被定义为接受Context作为参数,而不是Activity:
public AlertDialog.Builder(Context context)
构造函数使用此构建器的上下文及其创建的AlertDialog.
我错过了什么?
android android-context android-alertdialog android-activity
我一直在使用Android中的AsyncTasks,我正在处理一个问题.
举一个简单的例子,一个带有一个AsyncTask的Activity.在背景上的任务没有做任何壮观的事情,只是睡了8秒钟.
在onPostExecute()方法的AsyncTask结束时,我只是将按钮可见性状态设置为View.VISIBLE,仅用于验证我的结果.
现在,这种方法很有效,直到用户决定在AsyncTask工作时(在8秒睡眠窗口内)更改手机方向.
我理解Android活动生命周期,我知道活动被破坏并重新创建.
这就是问题所在.AsyncTask指的是一个按钮,显然是对最初启动AsyncTask的上下文的引用.
我希望,这个旧的上下文(因为用户导致方向更改)要么变为null,要么AsyncTask要引用NPE以引用它试图使其可见的按钮.
相反,没有抛出NPE,AsyncTask认为按钮引用不为null,将其设置为可见.结果?屏幕上什么也没发生!
更新:我通过保持WeakReference活动并在配置更改发生时切换来解决这个问题.这很麻烦.
这是代码:
public class Main extends Activity {
private Button mButton = null;
private Button mTestButton = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mButton = (Button) findViewById(R.id.btnStart);
mButton.setOnClickListener(new OnClickListener () {
@Override
public void onClick(View v) {
new taskDoSomething().execute(0l);
}
});
mTestButton = (Button) findViewById(R.id.btnTest);
}
private class TaskDoSomething extends AsyncTask<Long, Integer, Integer>
{
@Override
protected Integer doInBackground(Long... params) {
Log.i("LOGGER", "Starting...");
try {
Thread.sleep(8000);
} …Run Code Online (Sandbox Code Playgroud) 什么是this和之间的区别getContext(),当我说this我的意思是this在一个Activity.
android ×10
android-context ×10
baseadapter ×1
dagger-2 ×1
data-binding ×1
java ×1
mvvm ×1
process ×1
singleton ×1
static ×1
this ×1
view ×1