我的Activity正在尝试创建一个AlertDialog,它需要一个Context作为参数.如果我使用,这可以按预期工作:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
Run Code Online (Sandbox Code Playgroud)
但是,我很谨慎地使用"this"作为上下文,因为当Activity被销毁并重新创建甚至在屏幕旋转之类的简单事件时,可能会发生内存泄漏.来自Android开发者博客上的相关帖子:
有两种简单的方法可以避免与上下文相关的内存泄漏.最明显的一个是避免在其自身范围之外逃避上下文.上面的例子显示了静态引用的情况,但内部类及其对外部类的隐式引用可能同样危险.第二种解决方案是使用Application上下文.只要您的应用程序处于活动状态并且不依赖于活动生命周期,此上下文就会存在.如果您计划保留需要上下文的长期对象,请记住应用程序对象.您可以通过调用Context.getApplicationContext()或Activity.getApplication()轻松获取它.
但是对于这AlertDialog()两者来说,getApplicationContext()或者getApplication()作为一个Context是可接受的,因为它抛出异常:
"无法添加窗口 - 令牌null不适用于应用程序"
那么,这真的应该被视为一个"错误",因为我们被正式建议使用Activity.getApplication(),但它没有宣传的功能吗?
吉姆
这让我很难过,我在Android 2.1-r8 SDK中使用它:
ProgressDialog.show(getApplicationContext(), ....);
Run Code Online (Sandbox Code Playgroud)
还有
Toast t = Toast.makeText(getApplicationContext(),....);
Run Code Online (Sandbox Code Playgroud)
使用getApplicationContext()崩溃ProgressDialog和Toast....导致我这个问题:
尽管分享了"上下文"的措辞,但活动上下文和应用程序上下文之间的实际差异是什么?
如何在Android中显示活动指标?是否有任何Android库给定的方法?如果不是,请告诉我用于在Android中显示活动指示器的技巧?
这似乎应该很简单,但我在任何地方都找不到答案.我有一个Android应用程序,在后台执行网络任务.如果出现错误,我想显示错误对话框.当任务返回时,我不知道哪个Activity在前台.根据这篇文章,看起来我们不能使用应用程序上下文来显示一个对话框(事实上,如果我尝试的话,我确实会遇到崩溃).
那么我怎样才能获得当前活动的背景?同样,网络任务的接收器在Application上下文中运行,而不是在特定的Activity中运行.还有其他想法吗?
编辑:我应该澄清一下.如果我不是前台应用程序,我不想显示错误对话框.我只对我们的应用程序暂时处于前台的情况感兴趣.
我想ProgressDialog在Fragment课堂上展示一个.以下代码仅适用于Activity类,但不适用于Fragment.有人可以帮我这个,为什么这个ProgressDialog实现只是在一个Activity而不是一个Fragment?
private class ProcessUpdateProfile extends
AsyncTask<String, String, JSONObject> {
private ProgressDialog nDialog;
@Override
protected void onPreExecute() {
super.onPreExecute();
nDialog = new ProgressDialog(PFragment.this); //Here I get an error: The constructor ProgressDialog(PFragment) is undefined
nDialog.setMessage("Loading..");
nDialog.setTitle("Checking Network");
nDialog.setIndeterminate(false);
nDialog.setCancelable(true);
nDialog.show();
}
}
Run Code Online (Sandbox Code Playgroud) 我在我的应用程序中使用AppIntro库.
它有3张幻灯片.我想在显示第三张幻灯片时询问用户.为实现这一点,我正在使用afollestad的材料对话框.
AppIntro活动中的代码如下所示:
@Override
public void onNextPressed() {
if(this.pager.getCurrentItem() == 2) {
MaterialDialog dialog = new MaterialDialog.Builder(getApplicationContext())
.title("QR Code scannen")
.content("Möchtest du den QR Code scannen oder selbst eingeben?")
.positiveText("eingeben")
.negativeText("scannen")
.onPositive(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
Intent intent = new Intent(getApplicationContext(), RegistrationActivity.class);
startActivity(intent);
}
})
.onNegative(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
// TODO
}
})
.show();
}
}
Run Code Online (Sandbox Code Playgroud)
运行应用程序当我滑动到第三张幻灯片时,我遇到以下问题:
com.afollestad.materialdialogs.MaterialDialog$DialogException:
Bad …Run Code Online (Sandbox Code Playgroud) 例如,我可以使用和开始ApplicationContext工作吗?SharedPreferencesRemoteService
从逻辑上讲,我认为我可以.这种方法有细微差别吗?
伙计们 - 谁能解释这个堆栈?请注意,我的代码无处可去.如果你谷歌中的任何一个例外,遇到此问题的每个人都试图在活动终止后创建对话框,这似乎不是这里的情况.这只是一个简单的活动简历.我经常看到该领域的客户报告此异常,并且如果可能的话想要纠正它.
android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@405177d8 is not valid; is your activity running?
at android.view.ViewRoot.setView(ViewRoot.java:527)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
at android.view.Window$LocalWindowManager.addView(Window.java:424)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2268)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1721)
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:2955)
at android.app.ActivityThread.access$1600(ActivityThread.java:124)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:972)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:3806)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)
更新:
以下是我能够远程检索此堆栈的方法.首先,我在我的活动的onCreate顶部添加了一个uncaughtExceptionHandler:
try {
File crashLogDirectory = new File(Environment.getExternalStorageDirectory().getCanonicalPath() + Constants.CrashLogDirectory);
crashLogDirectory.mkdirs();
Thread.setDefaultUncaughtExceptionHandler(new RemoteUploadExceptionHandler(this, crashLogDirectory.getCanonicalPath()));
} catch (Exception e) {
if (MyActivity.WARN) Log.e(MyActivity.TAG, "Exception setting up …Run Code Online (Sandbox Code Playgroud) 我正在尝试在获取数据ProgressDialog时进行简单的显示AsyncTask.在我的onPreExecute()方法中我有这个:
pd = ProgressDialog.show(c, "Loading...", "Please wait");
Run Code Online (Sandbox Code Playgroud)
c传递到我的构造背景下AsyncTask的this.getApplicationContext().不幸的是,我不断收到此消息的异常:
无法添加窗口 - 令牌null不适用于应用程序
我究竟做错了什么?
更新:使用this而不是this.getApplicationContext()显示另一个问题.当我打电话时ProgressDialog.show(...,会显示ProgressDialog,但直到AsyncTask完成后才会显示.换句话说,数据加载然后显示对话框.如果我包括pd.dismiss()在我onPostExecute()当时我甚至从未看到对话框(因为它在打开之前已关闭).
最终解决方案:事实证明,这fetch.get()是占用UI线程而不是让ProgressDialog显示.
我正在尝试创建一个对话框,类似于Nova Launcher中的对话框(对话框的右上角):

显示应用程序的设置.我无法显示,我当前的对话框只显示一个正常的标题栏:当前代码:
自定义对话框文件:(add_dialog_custom_title)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:paddingLeft="15.0dip"
android:paddingRight="15.0dip"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView
android:textAppearance="?android:textAppearanceLarge"
android:gravity="center_vertical"
android:layout_width="0.0dip"
android:layout_height="wrap_content"
android:minHeight="?android:listPreferredItemHeight"
android:text="@string/menu_item_add_item"
android:drawablePadding="14.0dip"
android:layout_weight="1.0" />
<ImageView
android:layout_gravity="center"
android:id="@id/settings_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@android:drawable/ic_menu_preferences"
android:layout_weight="0.0" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
NfcUnlockActivity:
package com.quinny898.gcse.doorcontrol;
import android.app.*;
import android.widget.*;
import android.content.*;
import android.text.*;
import android.os.*;
import android.view.*;
public class NfcUnlockActivity extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AlertDialog.Builder builder;
AlertDialog alertDialog;
Context mContext = getApplicationContext();
Dialog dialog = new Dialog (mContext);
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(LAYOUT_INFLATER_SERVICE); …Run Code Online (Sandbox Code Playgroud) 我试图从视图中的AsyncTask的onPostExecute()(A.xml)mainActivity中膨胀视图(B.xml)(其中有微调器)
MainActivity.class
protected void onPostExecute(String result) {
LayoutInflater vi = (LayoutInflater) getApplicationContext()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = vi.inflate(R.layout.B, null);
branded_spinner = (Spinner) v.findViewById(R.id.Spinner01);
adapter_branded = new ArrayAdapter<String>(**MainActivity.this**,
android.R.layout.simple_spinner_item, Branded);
adapter_branded.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
branded_spinner.setAdapter(adapter_branded);
branded_spinner.setOnItemSelectedListener(**MainActivity.this**);
Run Code Online (Sandbox Code Playgroud)
}
它适用于4.0及以上版本
但是对于2.3.3我得到一个错误
11-30 15:28:55.492: E/AndroidRuntime(540): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
11-30 15:28:55.492: E/AndroidRuntime(540): at android.view.ViewRoot.setView(ViewRoot.java:531)
11-30 15:28:55.492: E/AndroidRuntime(540): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
11-30 15:28:55.492: E/AndroidRuntime(540): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
Run Code Online (Sandbox Code Playgroud)
是的,我试图使用getApplicationContext(),但这仍然是相同的错误
我提到了
使用getApplication()作为上下文抛出"无法添加窗口 - 令牌null不适用于应用程序"的对话框
Android:ProgressDialog.show()与getApplicationContext崩溃
Android 1.6:"android.view.WindowManager $ BadTokenException:无法添加窗口 - 令牌null不适用于应用程序"