我正在开发一个简单的APOD应用程序,它可以实现:
RecyclerViewCardViewFirebasePicasso该应用程序从中抓取图像和文本,Firebase并将其Firebase Storage显示在a中CardView,并OnClickListener为每个设置View.当用户点击图片时,我打开一个新Activity的Intent.第二个Activity显示原始单击的图像,以及有关它的更多信息.
GridLayoutManager如果用户的手机是VERTICAL,我已经使用1列实现了这一切,如果用户的手机是HORIZONTAL则使用3列.
我遇到的问题是我似乎无法挽救RecyclerView方向改变的立场.我已经尝试了我能找到的每一个选项,但似乎都没有.唯一的结论,我可以想出,是在旋转,我毁坏Firebase的ChildEventListener,以避免内存泄漏,一旦定位完成后,Firebase再查询,因为新实例的数据库ChildEventListener.
有什么方法可以挽救我RecyclerView对方向改变的立场吗?我不想要,android:configChanges因为它不会让我改变我的布局,我已经尝试过保存为一个Parcelable,这是不成功的.我确信这很容易让我失踪,但是,嘿,我是新手.我非常感谢您对我的代码的任何帮助或建议.谢谢!
下面是我的课程,我只简化了必要的代码.
主要活动
public class MainActivity extends AppCompatActivity {
private RecyclerAdapter mRecyclerAdapter;
private DatabaseReference mDatabaseReference;
private RecyclerView mRecyclerView;
private Query query;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
setContentView(R.layout.activity_main);
getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
Toolbar toolbar = (Toolbar) …Run Code Online (Sandbox Code Playgroud) 我在android中有一个简单的活动程序.基本上这个类只是扩展Activity.但是当我启动它时,我在我的类的构造函数中得到一个ClassCastException.我甚至没有定义构造函数,所以它必须在超类的构造函数中是Activity.
不幸的是,调试器没有提供有关它正在尝试强制转换的类的任何详细信息.
这是堆栈跟踪:
Thread [<1> main] (Suspended (exception RuntimeException))
ActivityThread$PackageInfo.makeApplication(boolean, Instrumentation) line: 649
ActivityThread.handleBindApplication(ActivityThread$AppBindData) line: 4232
ActivityThread.access$3000(ActivityThread, ActivityThread$AppBindData) line: 125
ActivityThread$H.handleMessage(Message) line: 2071
ActivityThread$H(Handler).dispatchMessage(Message) line: 99
Looper.loop() line: 123
ActivityThread.main(String[]) line: 4627
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]
Method.invoke(Object, Object...) line: 521
ZygoteInit$MethodAndArgsCaller.run() line: 868
ZygoteInit.main(String[]) line: 626
NativeStart.main(String[]) line: not available [native method]
Run Code Online (Sandbox Code Playgroud)
当我查看runtimeexception时,我得到:
detailMessage "Unable to instantiate application com.test.MyApp: java.lang.ClassCastException: com.test.MyApp" (id=830067694464)
唯一的代码是
package com.test;
import android.app.Activity;
public class MyApp extends Activity …Run Code Online (Sandbox Code Playgroud) 我正在开发一个简单的APOD应用程序,在其中显示RecyclerView用户可以滚动浏览的天文学图片。我启用了FirebaseDatabase.setPersistenceEnabled(true);此功能,以便用户可以离线使用该应用程序并减少连接/下载带宽。问题是,如果我设置FirebaseDatabase.setPersistenceEnabled(true);,我的应用程序启动时间会明显更长(启用6秒与禁用1.5秒)。我了解用户首次启动应用程序时,加载时间应该更长(因为设置了持久性),但是,由于应用程序不查询在线Firebase服务器,因此随后的每次启动应用程序都不应显着缩短吗?
为了避免一次加载很多行,我SingleValueEventListeners逐一触发了两行。第一个加载100行,并使用循环遍历databaseSnapshot AsyncTask,然后显示图像。然后,我调用第二个,SingleValueEventListener并以相同的方式遍历第二个。第二个SingleValueEventListener加载剩余的数据,范围是101-7000。
下面是我的GlobalApp延伸课程Application。这是我启用持久性的地方。接下来的2种方法是我加载数据的位置。
扩展应用程序类别
public class GlobalApp extends Application {
@Override
public void onCreate() {
super.onCreate();
FirebaseDatabase mDatabaseReference = FirebaseDatabase.getInstance();
mDatabaseReference.setPersistenceEnabled(true);
}
}
Run Code Online (Sandbox Code Playgroud)
初始负荷
private void initialLoad() {
databaseReference.child("apod").orderByChild("date").limitToLast(100).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
new LoadFirebase().execute(dataSnapshot);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
Run Code Online (Sandbox Code Playgroud)
二次负荷
private void secondLoad() {
final String secondKey = firebaseKeys.get(firebaseKeys.size() - 1);
databaseReference.child("apod").orderByChild("date").endAt(secondKey).addListenerForSingleValueEvent(new …Run Code Online (Sandbox Code Playgroud)