简体   繁体   中英

java.lang.RuntimeException: Unable to instantiate activity…(android studio)

i was learning in tutorial todolist , but have problem with app. Emulator and my phone show " todolist4 has stopped ". In "Sync" all in green, but in logcat show some errors. I watched different answers, but they didn't help me. I tried to change firmware in emulator and app, but it too didn't solved problem.

    public class MainActivity extends AppCompatActivity {//ActivityAppCompatActivity

List<ToDo> toDoList = new ArrayList<>();
FirebaseFirestore db;

RecyclerView listItem;
RecyclerView.LayoutManager layoutManager;

FloatingActionButton fab;

public MaterialEditText title, description;
public boolean isUpdate = false;
public String idUpdate = "";

ListItemAdapter adapter;

//AlertDialog dialog;
android.app.AlertDialog dialog=new SpotsDialog(MainActivity.this);

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(com.example.sud.todolist4.R.layout.activity_main);


    //Init FireStore
    db = FirebaseFirestore.getInstance();

    //View
    dialog = new SpotsDialog(this);
    title = (MaterialEditText)findViewById(com.example.sud.todolist4.R.id.title);
    description = (MaterialEditText)findViewById(com.example.sud.todolist4.R.id.description);
    fab = (FloatingActionButton)findViewById(com.example.sud.todolist4.R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //Add New

            if(!isUpdate)
            {
                setData(title.getText().toString(), description.getText().toString());
            }
            else
            {
                updateData(title.getText().toString(), description.getText().toString());
                isUpdate = !isUpdate; //reset flag
            }

        }

    });

    listItem = (RecyclerView)findViewById(com.example.sud.todolist4.R.id.listTodo);
    listItem.setHasFixedSize(true);
    layoutManager = new LinearLayoutManager(this);
    listItem.setLayoutManager(layoutManager);

    loadData(); //load data from FireStore
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    if (item.getTitle().equals("DELETE"))
        deleteItem(item.getOrder());
    return super.onContextItemSelected(item);
}
private void deleteItem(int index) {
    db.collection("ToDoList")
            .document(toDoList.get(index).getId())
            .delete()
            .addOnSuccessListener(new OnSuccessListener<Void>() {
                @Override
                public void onSuccess(Void aVoid) {
                    loadData();
                }
            });
}
private void updateData(String title, String description) {
    db.collection("ToDoList").document(idUpdate)
            .update("title",title,"descripton",description)
            .addOnSuccessListener(new OnSuccessListener<Void>() {
                @Override
                public void onSuccess(Void aVoid) {
                    Toast.makeText(MainActivity.this, "Updated !", Toast.LENGTH_SHORT).show();
                }
            });

    //Realtime update refresh data;
    db.collection("ToDoList").document(idUpdate)
            .addSnapshotListener(new EventListener<DocumentSnapshot>() {
                @Override
                public void onEvent(@Nullable DocumentSnapshot documentSnapshot, @Nullable FirebaseFirestoreException e) {
                    loadData();
                }
            });

}
private void setData(String title, String description) {
    //Random id
    String id = UUID.randomUUID().toString();
    Map<String, Object> todo = new HashMap<>();
    todo.put("id", id );
    todo.put("title", title );
    todo.put("description", description );

    db.collection("ToDoList").document(id)
            .set(todo).addOnSuccessListener(new OnSuccessListener<Void>() {
        @Override
        public void onSuccess(Void aVoid) {
            //Refresh data;
            loadData();
        }
    });
}
private void loadData() {
    dialog.show();
    if(toDoList.size() > 0)
        toDoList.clear(); //Remove old value
    db.collection("ToDoList")
            .get()
            .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>()
            {
                @Override
                public void onComplete(@NonNull Task<QuerySnapshot> task)
                {
                    for(DocumentSnapshot doc:task.getResult())
                    {
                        ToDo todo = new ToDo(doc.getString("id"),
                                doc.getString("title"),
                                doc.getString("description"));
                        toDoList.add(todo);
                    }
                    adapter = new ListItemAdapter(MainActivity.this,toDoList);
                    listItem.setAdapter(adapter);
                    dialog.dismiss();

                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Toast.makeText(MainActivity.this, ""+e.getMessage(), Toast.LENGTH_SHORT).show();
                }
            });
}}

LogCat

04-24 16:33:44.697 16627-16627/com.example.sud.todolist4 E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.sud.todolist4, PID: 16627
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.sud.todolist4/com.example.sud.todolist4.MainActivity}: java.lang.IllegalStateException: System services not available to Activities before onCreate()
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2679)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
    at android.app.ActivityThread.-wrap11(Unknown Source:0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6494)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
 Caused by: java.lang.IllegalStateException: System services not available to Activities before onCreate()
    at android.app.Activity.getSystemService(Activity.java:5915)
    at android.app.Dialog.<init>(Dialog.java:183)
    at android.app.AlertDialog.<init>(AlertDialog.java:201)
    at android.app.AlertDialog.<init>(AlertDialog.java:197)
    at dmax.dialog.SpotsDialog.<init>(SpotsDialog.java:39)
    at dmax.dialog.SpotsDialog.<init>(SpotsDialog.java:25)
    at com.example.sud.todolist4.MainActivity.<init>(MainActivity.java:55)
    at java.lang.Class.newInstance(Native Method)
    at android.app.Instrumentation.newActivity(Instrumentation.java:1174)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2669)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856) 
    at android.app.ActivityThread.-wrap11(Unknown Source:0) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589) 
    at android.os.Handler.dispatchMessage(Handler.java:106) 
    at android.os.Looper.loop(Looper.java:164) 
    at android.app.ActivityThread.main(ActivityThread.java:6494) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

Manifest

<?xml version="1.0" encoding="utf-8"?>

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <uses-library android:name="com.google.android.maps" />
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

You cant take the reference to the mainAnctivity with MainActivity.this if the activity was not created. The activity gets created after onCreate was called. That is why you get this error.

Change this line :

android.app.AlertDialog dialog=new SpotsDialog(MainActivity.this);

to:

android.app.AlertDialog dialog;

And initialise it in onCreate like this:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(com.example.sud.todolist4.R.layout.activity_main);

    dialog=new SpotsDialog(MainActivity.this);

    //Init FireStore
    db = FirebaseFirestore.getInstance();
...

The error message seems pretty clear: System services not available to Activities before onCreate() . In the stack trace you can see it's invoked by the constructor of SpotsDialog.

Replace

//AlertDialog dialog;
android.app.AlertDialog dialog=new SpotsDialog(MainActivity.this);

with

//AlertDialog dialog;
android.app.AlertDialog dialog;

This initialization was useless as you initiliaze it again in the onCreate methode.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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