我正在尝试测试Firebase云消息传递API,因为控制台无法使用所有功能(特别是在应用程序处于后台时自定义通知).但由于某些原因,我无法让它工作,它总是出现401错误.我调查了这个的原因,并在重新生成新的服务器密钥后尝试了它,但错误保持不变.令人惊讶的是,当我生成新的服务器密钥时,它不会反映在Firebase控制台中,并且它将服务器密钥显示为空.此外,我尝试将我的IP地址添加到服务器白名单IP但仍然没有运气.我附上了一个我用Postman做的请求的截图(我用服务器密钥代替serverKey.
这是在一次Android采访中被问到的.我被问到是否可以从异步任务1的doInBackground()方法启动另一个异步任务(让它成为Task2)(让它成为Task1).我已经阅读了以下文档:
必须在UI线程上创建任务实例.
必须在UI线程上调用execute(Params ...).
根据这些陈述,我认为不应该从另一个任务的后台方法启动任务.此外,异步任务有UI方法(不能在后台线程上使用),所以加强了我的论点,我回答它是不可能的.
在检查一个简单的演示应用程序时,我看到它确实可以这样做.一些演示代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext = this;
init();
Log.v ("gaurav", "Thread is : " + Thread.currentThread().getName());
Task1 task = new Task1();
task.execute();
}
class Task1 extends AsyncTask {
@Override
protected Object doInBackground(Object... params) {
// TODO Auto-generated method stub
Log.v ("gaurav", "Thread task 1 is : " + Thread.currentThread().getName());
Task2 task = new Task2();
task.execute();
return null;
}
}
class Task2 extends AsyncTask {
@Override
protected Object doInBackground(Object... params) { …Run Code Online (Sandbox Code Playgroud) 我想知道Android中的Adapter和Loader有什么区别.我已经查看了文档,但无法弄清楚它们之间的区别.任何帮助,将不胜感激.谢谢!
我检查了LRUCache的官方Android文档,其中说:每次访问一个值时,它都会移动到队列的头部.将值添加到完整缓存时,该队列末尾的值将被逐出,并且可能符合垃圾回收的条件.我想这是双链表,它由缓存使用的linkedhashmap维护.为了检查这种行为,我检查了LruCache的源代码,并检查了get(K key)方法.它进一步调用map的get方法,该方法从底层hashmap获取值并调用recordAccess方法.
public V get(Object key) {
LinkedHashMapEntry<K,V> e = (LinkedHashMapEntry<K,V>)getEntry(key);
if (e == null)
return null;
e.recordAccess(this);
return e.value;
}
Run Code Online (Sandbox Code Playgroud)
如果accessOrder设置为true(对于我的问题,我们假设它是),recordAccess方法依次将访问的条目移动到列表的末尾,否则它什么都不做.
/**
* This method is invoked by the superclass whenever the value
* of a pre-existing entry is read by Map.get or modified by Map.set.
* If the enclosing Map is access-ordered, it moves the entry
* to the end of the list; otherwise, it does nothing.
*/
void recordAccess(HashMap<K,V> m) {
LinkedHashMap<K,V> lm …Run Code Online (Sandbox Code Playgroud) 我正在开发一个应用程序,它要求我手动处理fling过程而不是将其提供给框架.我想要实现的是基本上计算listview在收到fling动作时移动的像素数量.由于滚动方法已经提供了三角形的距离,我已经轻松处理了它.但是有没有办法获得投掷距离,因为在超级方法中只传递速度参数.
注意 - 我必须根据投掷距离移动另一个视图,所以我需要同时获取它,就像onScroll提供它一样.谢谢.
我一直在研究内存泄漏并使用内存分析器工具来检查它们.因此,作为一种实践,我有以下代码泄漏活动,因为匿名内部类持有对活动的引用.这是代码:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
exampleOne();
}
private void exampleOne() {
new Thread() {
@Override
public void run() {
while (true) {
SystemClock.sleep(1000);
}
}
}.start();
}
}
Run Code Online (Sandbox Code Playgroud)
我在这里有上述泄漏的记忆分析仪图像(6次旋转):

很明显,有6个正在运行的线程持有对外部活动的隐式引用,从而防止它被垃圾回收.
现在,请考虑以下代码:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
exampleTwo();
}
private void exampleTwo() {
new MyThread().start();
}
private static class MyThread extends Thread {
@Override
public void run() {
while (true) {
SystemClock.sleep(1000);
}
} …Run Code Online (Sandbox Code Playgroud) 据我所知,该功能用于切换软输入.但我对作为参数传递的标志如何工作感到困惑.任何一个例子都是可观的(我也想要解释,以便我得到确切的功能).谢谢!
我正在学习Effective Java,第8项(在覆盖equals时遵守一般合同).作者已经非常清楚地解释了这一点,但仍有一些部分没有详细阐述.
对于此示例,他将类CaseInsensitiveString定义为:
public final class CaseInsensitiveString {
private final String s;
public CaseInsensitiveString(String s) {
if (s == null)
throw new NullPointerException();
this.s = s;
}
// Broken - violates symmetry!
@Override
public boolean equals(Object o) {
if (o instanceof CaseInsensitiveString)
return s.equalsIgnoreCase(((CaseInsensitiveString) o).s);
if (o instanceof String) // One-way interoperability!
return s.equalsIgnoreCase((String) o);
return false;
}
// ... // Remainder omitted
}
Run Code Online (Sandbox Code Playgroud)
在文章的最后,他说:
对于某些类,例如上面的CaseInsensitiveString,字段比较比简单的相等测试更复杂.如果是这种情况,您可能希望存储该字段的规范形式,因此equals方法可以对这些规范形式进行廉价的精确比较,而不是更昂贵的不精确比较.这种技术最适用于不可变类(第15项); 如果对象可以更改,则必须使规范形式保持最新.
我搜索了这个术语,发现它基本上意味着某种东西的标准表示,比如绝对路径,没有任何目录中文件的符号链接.但是我无法理解在这个课程中使用"规范"形式,这在这里会有所帮助.有什么建议?
鉴于Android中的安全模型,我正在尝试使用广播接收器的自定义权限.
我做了什么:
我已经为接收器声明了自定义权限,从而限制了它可以接收的广播.清单中的一些代码:
<permission android:name="abc"/>
<receiver android:name=".UpdateUserReceiver"
android:permission="abc"
android:enabled="true"
android:exported="false">
<intent-filter>
<action android:name="android.intent.action.ACTION_UPDATE_USERNAME"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
现在我希望接收器UpdateUserReceiver只接收来自使用权限'abc'的组件的广播.
广播发送代码:
// Update username. Invoke broadcast.
Intent updateUserBroadcast = new Intent();
updateUserBroadcast.putExtra("username", userName);
updateUserBroadcast.setAction("android.intent.action.ACTION_UPDATE_USERNAME");
sendBroadcast(updateUserBroadcast);
Run Code Online (Sandbox Code Playgroud)
发送广播的活动:
<activity android:name=".UpdateUserNameActivity">
<intent-filter>
<action android:name="com.intent.action.UPDATE_USERNAME"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
Run Code Online (Sandbox Code Playgroud)
问题1:如图所示,活动无处使用接收方声明的权限,以便它可以从活动接收广播.但仍然调用接收器,我怀疑它是由于使用隐式意图虽然我不确定.有任何想法吗?
问题2:在应用级别声明的权限标记和接收者内部的android:permission标记之间有什么区别?我理解第二个的使用,它在任何人都可以期待接收者接收广播之前强制执行许可,但是为什么是第一个需要的.是否需要此方案,或者是否可以将其删除.无论哪种方式,我都检查过接收器接收广播.
android broadcastreceiver android-permissions android-security
我在我的Android应用程序中集成了Linkedin和Amazon登录.我从他们的文档中学习了OAuth2,并了解了这个过程.但是我对整个过程有些困惑:
我认为应该发生什么(以LinkedIn为例):
首先,我的问题是,在获取重定向网址后,后端会对访问令牌进行另一次API调用吗?或者后端会以某种方式将我带到我的应用程序(如果是,如何?),然后我的应用程序将调用访问令牌.
我的另一个疑问是,即使不使用OAuth2,我也可以使用以下代码获取LinkedIn用户数据:
LISessionManager.getInstance(getApplicationContext())
.init(this, buildScope(), new AuthListener() {
@Override
public void onAuthSuccess() {
mLinkedinAccessToken = LISessionManager
.getInstance(getApplicationContext())
.getSession().getAccessToken().toString();
Toast.makeText(getApplicationContext(), "success" + mLinkedinAccessToken, Toast.LENGTH_LONG).show();
APIHelper apiHelper = APIHelper.getInstance(getApplicationContext());
apiHelper.getRequest(FaceBookLoginActivity.this, topCardUrl, new ApiListener() {
@Override
public void onApiSuccess(ApiResponse s) {
Gson gson = new Gson();
mLinkedInUserInfo = gson.fromJson(s.getResponseDataAsString(), LinkedInUserInfo.class);
Run Code Online (Sandbox Code Playgroud)
在这里,我没有指定任何重定向URL,甚至没有点击他们在文档中提到的URL,但我可以轻松访问数据.这不是打败了安全认证的全部目的吗?当然,我错过了一些东西,对整个过程有点困惑.我在这里感谢一些帮助.