【问题标题】:Could not instantiate activity - android studio无法实例化活动 - android studio
【发布时间】:2016-07-19 20:47:05
【问题描述】:

我正在 android studio 中创建一个应用程序,当启动我的一项活动时,应用程序崩溃并说它无法实例化该活动。

我检查了清单文件,活动名称带有红色下划线,上面写着“X 不是具体类 - 验证 Android XML 文件中的资源。”

任何帮助将不胜感激,我不知道为什么这不起作用。我是开发新手,所以如果这是一个愚蠢的问题,我真的很抱歉/请原谅我,我敢肯定,糟糕的代码。

这是我在运行应用程序时遇到的错误

    07-12 10:01:50.260 918-3861/? I/ActivityManager: START u0 {cmp=com.example.daniel.digit/.Results (has extras)} from uid 10226 on display 0
07-12 10:01:50.276 27379-27379/com.example.daniel.digit E/AndroidRuntime: FATAL EXCEPTION: main
                                                                          Process: com.example.daniel.digit, PID: 27379
                                                                          java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.daniel.digit/com.example.daniel.digit.Results}: java.lang.InstantiationException: java.lang.Class<com.example.daniel.digit.Results> cannot be instantiated
                                                                              at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2327)
                                                                              at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
                                                                              at android.app.ActivityThread.-wrap11(ActivityThread.java)
                                                                              at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
                                                                              at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                              at android.os.Looper.loop(Looper.java:148)
                                                                              at android.app.ActivityThread.main(ActivityThread.java:5422)
                                                                              at java.lang.reflect.Method.invoke(Native Method)
                                                                              at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                              at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
                                                                           Caused by: java.lang.InstantiationException: java.lang.Class<com.example.daniel.digit.Results> cannot be instantiated
                                                                              at java.lang.Class.newInstance(Native Method)
                                                                              at android.app.Instrumentation.newActivity(Instrumentation.java:1067)
                                                                              at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2317)
                                                                              at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
                                                                              at android.app.ActivityThread.-wrap11(ActivityThread.java) 
                                                                              at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
                                                                              at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                              at android.os.Looper.loop(Looper.java:148) 
                                                                              at android.app.ActivityThread.main(ActivityThread.java:5422) 
                                                                              at java.lang.reflect.Method.invoke(Native Method) 
                                                                              at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                                                                              at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
07-12 10:01:50.281 918-4161/? W/ActivityManager:   Force finishing activity com.example.daniel.digit/.Results
07-12 10:01:50.284 918-4161/? W/ActivityManager:   Force finishing activity com.example.daniel.digit/.Questions
07-12 10:01:50.339 918-32759/? I/OpenGLRenderer: Initialized EGL, version 1.4
07-12 10:01:50.682 3271-14700/? W/MessageQueue: Handler (akgv) {896094c} sending message to a Handler on a dead thread
                                                java.lang.IllegalStateException: Handler (akgv) {896094c} sending message to a Handler on a dead thread
                                                    at android.os.MessageQueue.enqueueMessage(MessageQueue.java:543)
                                                    at android.os.Handler.enqueueMessage(Handler.java:631)
                                                    at android.os.Handler.sendMessageAtTime(Handler.java:600)
                                                    at android.os.Handler.sendMessageDelayed(Handler.java:570)
                                                    at android.os.Handler.post(Handler.java:326)
                                                    at rbv.a(:com.google.android.gms:1065)
                                                    at akox.a(:com.google.android.gms:140)
                                                    at akuj.a(:com.google.android.gms:374)
                                                    at aksn.a(:com.google.android.gms:2077)
                                                    at akll.a(:com.google.android.gms:93)
                                                    at akmw.a(:com.google.android.gms:262)
                                                    at akmx.run(:com.google.android.gms:2049)
                                                    at akgv.handleMessage(:com.google.android.gms:233)
                                                    at android.os.Handler.dispatchMessage(Handler.java:102)
                                                    at android.os.Looper.loop(Looper.java:148)
                                                    at android.os.HandlerThread.run(HandlerThread.java:61)
07-12 10:01:50.785 918-931/? W/ActivityManager: Activity pause timeout for ActivityRecord{85c8890 u0 com.example.daniel.digit/.Results t49287 f}

这是该活动的代码

package com.example.daniel.digit;

import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.places.PlacePhotoMetadata;
import com.google.android.gms.location.places.PlacePhotoMetadataBuffer;
import com.google.android.gms.location.places.PlacePhotoMetadataResult;
import com.google.android.gms.location.places.Places;

import org.json.JSONArray;
import org.json.JSONObject;

import java.util.List;

import se.walkercrou.places.GooglePlaces;
import se.walkercrou.places.GooglePlacesInterface;
import se.walkercrou.places.Param;
import se.walkercrou.places.Place;
import se.walkercrou.places.Price;
import se.walkercrou.places.exception.GooglePlacesException;

abstract public class Results extends AppCompatActivity
        implements GooglePlacesInterface { //, GoogleApiClient.OnConnectionFailedListener {

    //Variables via intent from Questions
    Intent resultsIntent = getIntent();
    public String APIKEY = resultsIntent.getStringExtra("API_KEY"); //API Key
    public String RestaurantType = resultsIntent.getStringExtra("RestaurantType"); //Restaurant Type\
    public String Coordinates = resultsIntent.getStringExtra("Coordinates"); //Restaurant Type
    public Integer CostValue = resultsIntent.getIntExtra("CostValue", 0); //Cost Value
    public String API_URL = resultsIntent.getStringExtra("URI"); //API Request URI from URL Builder

    //Variables for view and card elements
    private TextView TextViewName1;
    private TextView TextViewName2;
    private ImageView Restaurant1Image;
    private ImageView Restaurant2Image;

    //Static variables
    public static int price;
    public static double Lat;
    public static double Lng;
    public static double Rating;
    public static String PlaceId;
    public static String Name;
    public static String PhotoRef;

    public GooglePlaces client;
    public List<Place> placesList;
    public String query;
    public String maxcost;
    public String mincost;
    public int counter = 0;
    //private GoogleApiClient mGoogleApiClient;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_results);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        //TextView variables
        TextViewName1 = (TextView) findViewById(R.id.restaurant1Name);
        TextViewName2 = (TextView) findViewById(R.id.restaurant2Name);

        //ImageView variables
        Restaurant1Image = (ImageView) findViewById(R.id.restaurant1Photo);
        Restaurant2Image = (ImageView) findViewById(R.id.restaurant2Photo);

        //sets query and mincost and maxcost
        query = (RestaurantType.equals("NO_TYPE") || RestaurantType.equals("Anything")) ? "Restaurant" : RestaurantType + "+Restaurant";
        mincost = (CostValue == 0) ? "0" : Integer.toString(CostValue - 2);
        maxcost = (CostValue == 0) ? "4" : Integer.toString(CostValue - 1);
        GooglePlaces client = new GooglePlaces(APIKEY);

        List<Place> placesList = client.getPlacesByQuery(query, Param.name("location").value(Coordinates),
                Param.name("minprice").value(mincost), Param.name("maxprice").value(maxcost),
                Param.name("opennow").value(true), Param.name("radius").value(MAXIMUM_RADIUS),
                Param.name("rankby=distance").value(true), Param.name("key").value(APIKEY));
    }

    public void btnRefreshOnClick (View v) {
        //run restaurantDetails twice
        restaurantDetails(counter);
        restaurantDetails(counter+1);

        //increase counter by 2
        counter = counter + 2;
    }

    public void restaurantDetails(int counter) {
        try {
            parse(client, placesList, getRequestHandler().get(API_URL), counter);
        } catch(Exception e) {
            throw new GooglePlacesException(e);
        }
        TextView restaurantName = ((counter%2) == 0) ? TextViewName1 : TextViewName2;
            //Assign name to TextView
            restaurantName.setText(Name);
}

   protected static void checkStatus(String statusCode, String errorMessage) {
        GooglePlacesException e = GooglePlacesException.parse(statusCode, errorMessage);
        if (e != null)
            throw e;
    }

    public static String parse(GooglePlaces client, List<Place> places, String str, int counter) {
        try {
            // parse json
            JSONObject json = new JSONObject(str);

            // check root elements
            String statusCode = json.getString(STRING_STATUS);
            checkStatus(statusCode, json.optString(STRING_ERROR_MESSAGE));
            if (statusCode.equals(STATUS_ZERO_RESULTS))
                return null;

            JSONArray results = json.getJSONArray(ARRAY_RESULTS);
            parseTextSearch(client, places, results, counter);

            return json.optString(STRING_NEXT_PAGE_TOKEN, null);
        }
        catch(Exception e){
            throw new GooglePlacesException(e);
        }
    }

    public static void parseTextSearch(GooglePlaces client, List<Place> places, JSONArray results,int counter) {
        try {
            if (counter >= results.length())
                return;

            JSONObject result = results.getJSONObject(counter);

            //Location
            JSONObject location = result.getJSONObject(OBJECT_GEOMETRY).getJSONObject(OBJECT_LOCATION);
            double Lat = location.getDouble(DOUBLE_LATITUDE);
            double Lng = location.getDouble(DOUBLE_LONGITUDE);

            String PlaceId = result.getString(STRING_PLACE_ID);
            String Name = result.optString(STRING_NAME);
            String PhotoRef = result.getString(STRING_PHOTO_REFERENCE);
            double Rating = result.optDouble(DOUBLE_RATING, -1);

            boolean priceDefined = result.has(INTEGER_PRICE_LEVEL);
            Price price = Price.NONE;
            if (priceDefined) {
                price = Price.values()[result.getInt(INTEGER_PRICE_LEVEL)];
            }
}

如果是相关的,清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.example.daniel.digit">

    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        tools:replace="android:icon,android:theme">
        <activity
            android:name=".SplashActivity"
            android:theme="@style/SplashTheme">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
        </activity>
        <activity
            android:name=".Questions"
            android:label="@string/title_activity_questions"
            android:parentActivityName=".MainActivity"
            android:theme="@style/AppTheme.NoActionBar">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.example.daniel.digit.MainActivity" />
        </activity>

        <uses-library
            android:name="com.android.volley"
            android:required="false" />

        <activity
            android:name=".Results"
            android:label="@string/title_activity_results"
            android:parentActivityName=".Questions"
            android:theme="@style/AppTheme.NoActionBar">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.example.daniel.digit.Questions"/>
        </activity>
        <meta-data android:name="com.google.android.geo.API_KEY" android:value="AIzaSyDvyih-7txW-4ajp8whWMZj5RsuUfORIoo"/>
    </application>

</manifest>

【问题讨论】:

  • class Results 被声明为abstract 有什么原因吗?
  • 我不知道。我是新手,所以我不太确定。

标签: java android class


【解决方案1】:

用class去掉abstract关键字

【讨论】:

    【解决方案2】:

    日志显示您的结果活动无法实例化。您已将其标记为抽象类 - 尝试在 Java 中实例化抽象类的对象是错误的。

    除非您打算扩展此类并实现具体方法然后实例化该活动,否则请删除 abstract 关键字。

    此外,您的活动中有很多静态方法 - 这是代码异味。

    【讨论】:

    • 代码异味是什么意思?在这种情况下静态方法有什么问题?
    • 静态方法将继续执行,如果它们正在执行,即使在 Android 需要销毁 Activity 的情况下(例如当方向改变时)。这将阻止垃圾收集并导致内存泄漏。静态方法还意味着它们将在另一个上下文中调用而不实例化实际对象 - 你永远不应该在另一个上下文中实例化活动,因此你永远不需要静态方法(尽管在代码中可能并不意味着这是一个好习惯)
    【解决方案3】:

    抽象类无法实例化

    abstract public class Results extends AppCompatActivity
            implements GooglePlacesInterface { //, GoogleApiClient.OnConnectionFailedListener {
    

    【讨论】:

      猜你喜欢
      • 2018-03-05
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多