не удается создать экземпляр activity componentinfo (Volley)

#java #android #android-volley

#java #Android #android-volley

Вопрос:

Я хотел бы реализовать Android volley, поэтому последовал этим примерам 1 2:

проект компилируется без ошибок, но HTTP-запрос не запускается, и Android выдает эту ошибку:

07-05 06:33:09.596: E/AndroidRuntime(1943): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.testsite.testvolley/com.testsite.testvolley.MainActivity}: java.lang.NullPointerException

MainActivity:

 package com.testsite.testvolley;

import com.android.volley.Request.Method;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.testsite.testvolley.MyVolley;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends Activity {

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

        RequestQueue queue = MyVolley.getRequestQueue();
        StringRequest myReq = new StringRequest(Method.GET, 
                                                "http://www.google.com/",
                                                createMyReqSuccessListener(),
                                                createMyReqErrorListener());

        queue.add(myReq);

    }

    TextView tv = (TextView) findViewById(R.id.textView1);

    private Response.Listener<String> createMyReqSuccessListener() {
        return new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                tv.setText(response);
            }
        };
    }


    private Response.ErrorListener createMyReqErrorListener() {
        return new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                tv.setText(error.getMessage());
            }
        };
    }

}
  

MyVolley.java:

 package com.testsite.testvolley;

import android.content.Context;
import android.app.ActivityManager;

import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.Volley;
import com.testsite.testvolley.BitmapLruCache;

public class MyVolley {
    private static RequestQueue mRequestQueue;
    private static ImageLoader mImageLoader;


    private MyVolley() {
        // no instances
    }


    static void init(Context context) {
        mRequestQueue = Volley.newRequestQueue(context);

        int memClass = ((ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE))
                .getMemoryClass();
        // Use 1/8th of the available memory for this memory cache.
        int cacheSize = 1024 * 1024 * memClass / 8;
        mImageLoader = new ImageLoader(mRequestQueue, new BitmapLruCache(cacheSize));
    }


    public static RequestQueue getRequestQueue() {
        if (mRequestQueue != null) {
            return mRequestQueue;
        } else {
            throw new IllegalStateException("RequestQueue not initialized");
        }
    }

    public static ImageLoader getImageLoader() {
        if (mImageLoader != null) {
            return mImageLoader;
        } else {
            throw new IllegalStateException("ImageLoader not initialized");
        }
    }
}
  

BitmapLruCache.java:

 package com.testsite.testvolley;

import android.graphics.Bitmap;
import android.support.v4.util.LruCache;

import com.android.volley.toolbox.ImageLoader.ImageCache;

public class BitmapLruCache extends LruCache<String, Bitmap> implements ImageCache {
    public BitmapLruCache(int maxSize) {
        super(maxSize);
    }


    @Override
    protected int sizeOf(String key, Bitmap value) {
        return value.getRowBytes() * value.getHeight();
    }


    @Override
    public Bitmap getBitmap(String url) {
        return get(url);
    }


    @Override
    public void putBitmap(String url, Bitmap bitmap) {
        put(url, bitmap);
    }
}
  

Android Manifest.xml:

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.testsite.testvolley"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />
    <uses-permission android:name="android.permission.INTERNET"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.testsite.testvolley.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.testsite.testvolley.MyVolley"
            android:label="@string/app_name" >
        </activity>
        <activity
            android:name="com.testsite.testvolley.BitmapLruCache"
            android:label="@string/app_name" >
        </activity>
    </application>

</manifest>
  

Я проверил volley.jar файл также включен в Buildpath. Кто-нибудь может указать, чего мне все еще не хватает?

РЕДАКТИРОВАТЬ: LogCat:

     07-05 07:25:06.755: E/AndroidRuntime(1933): FATAL EXCEPTION: main
07-05 07:25:06.755: E/AndroidRuntime(1933): Process: com.testsite.testvolley, PID: 1933
07-05 07:25:06.755: E/AndroidRuntime(1933): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.testsite.testvolley/com.testsite.testvolley.MainActivity}: java.lang.IllegalStateException: RequestQueue not initialized
07-05 07:25:06.755: E/AndroidRuntime(1933):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
07-05 07:25:06.755: E/AndroidRuntime(1933):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
07-05 07:25:06.755: E/AndroidRuntime(1933):     at android.app.ActivityThread.access$800(ActivityThread.java:135)
07-05 07:25:06.755: E/AndroidRuntime(1933):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
07-05 07:25:06.755: E/AndroidRuntime(1933):     at android.os.Handler.dispatchMessage(Handler.java:102)
07-05 07:25:06.755: E/AndroidRuntime(1933):     at android.os.Looper.loop(Looper.java:136)
07-05 07:25:06.755: E/AndroidRuntime(1933):     at android.app.ActivityThread.main(ActivityThread.java:5017)
07-05 07:25:06.755: E/AndroidRuntime(1933):     at java.lang.reflect.Method.invokeNative(Native Method)
07-05 07:25:06.755: E/AndroidRuntime(1933):     at java.lang.reflect.Method.invoke(Method.java:515)
07-05 07:25:06.755: E/AndroidRuntime(1933):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
07-05 07:25:06.755: E/AndroidRuntime(1933):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
07-05 07:25:06.755: E/AndroidRuntime(1933):     at dalvik.system.NativeStart.main(Native Method)
07-05 07:25:06.755: E/AndroidRuntime(1933): Caused by: java.lang.IllegalStateException: RequestQueue not initialized
07-05 07:25:06.755: E/AndroidRuntime(1933):     at com.testsite.testvolley.MyVolley.getRequestQueue(MyVolley.java:36)
07-05 07:25:06.755: E/AndroidRuntime(1933):     at com.testsite.testvolley.MainActivity.onCreate(MainActivity.java:24)
07-05 07:25:06.755: E/AndroidRuntime(1933):     at android.app.Activity.performCreate(Activity.java:5231)
07-05 07:25:06.755: E/AndroidRuntime(1933):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
07-05 07:25:06.755: E/AndroidRuntime(1933):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
07-05 07:25:06.755: E/AndroidRuntime(1933):     ... 11 more
  

Комментарии:

1. опубликовать полное исключение logcat

Ответ №1:

я также сталкиваюсь с той же проблемой… но я исправил это, используя другой класс, который расширяет Application (App_VolleyExample.java ) …

 public class App_VolleyExamples extends Application {

    private static Context applicationContext;
    @Override
    public void onCreate() {
        super.onCreate();

        applicationContext = this.getApplicationContext();
        MyVolley.init(applicationContext);

    }
  

и самое главное… вы также должны объявить в манифестеприложении)

 <application
        android:name="com.xxx.App_VolleyExamples"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
    .....
</application>
  

В моем случае я решил так. Надеюсь, это поможет.

Ответ №2:

Проблема в том, что вы установили textview findViewById вне onCreate метода.Итак, инициализируйте textview в методе activity, а не в классе activity. т.е. Измените

 public class MainActivity extends Activity {

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

        RequestQueue queue = MyVolley.getRequestQueue();
        StringRequest myReq = new StringRequest(Method.GET, 
                                                "http://www.google.com/",
                                                createMyReqSuccessListener(),
                                                createMyReqErrorListener());

        queue.add(myReq);

    }

    TextView tv = (TextView) findViewById(R.id.textView1);
  

Для

 public class MainActivity extends Activity {
      TextView tv; 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView) findViewById(R.id.textView1);

RequestQueue queue = MyVolley.getRequestQueue(this);
        StringRequest myReq = new StringRequest(Method.GET, 
                                                "http://www.google.com/",
                                                createMyReqSuccessListener(),
                                                createMyReqErrorListener());

        queue.add(myReq);


    }
  

Редактировать

Вы не инициализировали очередь запросов volley, поэтому сначала инициализируйте ее. так что измените это

   public static RequestQueue getRequestQueue() {
        if (mRequestQueue != null) {
            return mRequestQueue;
        } else {
            throw new IllegalStateException("RequestQueue not initialized");
        }
    }
  

Для

 public static RequestQueue getRequestQueue(Context mContext) {
    if (mRequestQueue == null) {
        mRequestQueue = Volley.newRequestQueue(mContext);  
    } 
    return mRequestQueue;
}
  

и изменить

     RequestQueue queue = MyVolley.getRequestQueue();
  

Для

 RequestQueue queue = MyVolley.getRequestQueue(this);
  

в OnCreate методе activity.

Комментарии:

1. @user3798619 вы изменили свой код, как я предлагаю.

2. Очистите проект и повторите попытку, а также проверьте свой logcat, если все еще происходит сбой.

3. все тот же сбой приложения, на этот раз я удалил textview и заменил на system.out.println() это просто означает, что сбой приложения не связан с textview

4. @user3798619 Как вы сказали,вы удалили textview, затем вы также удалили tv из createMyReqSuccessListener и функции createMyReqErrorListener?

5. @user3798619 и что такое строка 31.