2014-08-29 32 views
0

在嘗試加載以下活動時,我遇到了NullPoint異常,我嘗試解決問題,但嘗試失敗。Nullpoint異常 - ImageLoader

簡而言之,有兩個活動 - 一個填充數組列表,一旦點擊數組列表中的一個項目,用戶就會到第二個活動頁面(這個頁面)填充關於該項目的更多信息。我的問題解決了在第二個活動中通過JSON填充圖像的問題。

下面是logcat的消息:

08-28 23:35:21.478: E/AndroidRuntime(5085): FATAL EXCEPTION: main 
08-28 23:35:21.478: E/AndroidRuntime(5085): Process: com.dooba.beta, PID: 5085 
08-28 23:35:21.478: E/AndroidRuntime(5085): java.lang.NullPointerException 
08-28 23:35:21.478: E/AndroidRuntime(5085):  at com.android.volley.toolbox.ImageLoader.get(ImageLoader.java:233) 
08-28 23:35:21.478: E/AndroidRuntime(5085):  at com.android.volley.toolbox.ImageLoader.get(ImageLoader.java:171) 
08-28 23:35:21.478: E/AndroidRuntime(5085):  at com.android.volley.toolbox.NetworkImageView.loadImageIfNecessary(NetworkImageView.java:140) 
08-28 23:35:21.478: E/AndroidRuntime(5085):  at com.android.volley.toolbox.NetworkImageView.onLayout(NetworkImageView.java:180) 
08-28 23:35:21.478: E/AndroidRuntime(5085):  at android.view.View.layout(View.java:14817) 
08-28 23:35:21.478: E/AndroidRuntime(5085):  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671) 
08-28 23:35:21.478: E/AndroidRuntime(5085):  at android.widget.LinearLayout.layoutHorizontal(LinearLayout.java:1660) 
08-28 23:35:21.478: E/AndroidRuntime(5085):  at android.widget.LinearLayout.onLayout(LinearLayout.java:1436) 
08-28 23:35:21.478: E/AndroidRuntime(5085):  at android.view.View.layout(View.java:14817) 
08-28 23:35:21.478: E/AndroidRuntime(5085):  at android.view.ViewGroup.layout(ViewGroup.java:4631) 
08-28 23:35:21.478: E/AndroidRuntime(5085):  at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453) 
08-28 23:35:21.478: E/AndroidRuntime(5085):  at android.widget.HorizontalScrollView.onLayout(HorizontalScrollView.java:1474) 
08-28 23:35:21.478: E/AndroidRuntime(5085):  at android.view.View.layout(View.java:14817) 
08-28 23:35:21.478: E/AndroidRuntime(5085):  at android.view.ViewGroup.layout(ViewGroup.java:4631) 
08-28 23:35:21.478: E/AndroidRuntime(5085):  at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1055) 
08-28 23:35:21.478: E/AndroidRuntime(5085):  at android.view.View.layout(View.java:14817) 
08-28 23:35:21.478: E/AndroidRuntime(5085):  at android.view.ViewGroup.layout(ViewGroup.java:4631) 
08-28 23:35:21.478: E/AndroidRuntime(5085):  at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453) 
08-28 23:35:21.478: E/AndroidRuntime(5085):  at android.widget.FrameLayout.onLayout(FrameLayout.java:388) 
08-28 23:35:21.478: E/AndroidRuntime(5085):  at android.view.View.layout(View.java:14817) 
08-28 23:35:21.478: E/AndroidRuntime(5085):  at android.view.ViewGroup.layout(ViewGroup.java:4631) 
08-28 23:35:21.478: E/AndroidRuntime(5085):  at com.android.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:374) 
08-28 23:35:21.478: E/AndroidRuntime(5085):  at android.view.View.layout(View.java:14817) 
08-28 23:35:21.478: E/AndroidRuntime(5085):  at android.view.ViewGroup.layout(ViewGroup.java:4631) 
08-28 23:35:21.478: E/AndroidRuntime(5085):  at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453) 
08-28 23:35:21.478: E/AndroidRuntime(5085):  at android.widget.FrameLayout.onLayout(FrameLayout.java:388) 
08-28 23:35:21.478: E/AndroidRuntime(5085):  at android.view.View.layout(View.java:14817) 
08-28 23:35:21.478: E/AndroidRuntime(5085):  at android.view.ViewGroup.layout(ViewGroup.java:4631) 
08-28 23:35:21.478: E/AndroidRuntime(5085):  at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1987) 
08-28 23:35:21.478: E/AndroidRuntime(5085):  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1744) 
08-28 23:35:21.478: E/AndroidRuntime(5085):  at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000) 
08-28 23:35:21.478: E/AndroidRuntime(5085):  at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5670) 
08-28 23:35:21.478: E/AndroidRuntime(5085):  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761) 
08-28 23:35:21.478: E/AndroidRuntime(5085):  at android.view.Choreographer.doCallbacks(Choreographer.java:574) 
08-28 23:35:21.478: E/AndroidRuntime(5085):  at android.view.Choreographer.doFrame(Choreographer.java:544) 
08-28 23:35:21.478: E/AndroidRuntime(5085):  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747) 
08-28 23:35:21.478: E/AndroidRuntime(5085):  at android.os.Handler.handleCallback(Handler.java:733) 
08-28 23:35:21.478: E/AndroidRuntime(5085):  at android.os.Handler.dispatchMessage(Handler.java:95) 
08-28 23:35:21.478: E/AndroidRuntime(5085):  at android.os.Looper.loop(Looper.java:136) 
08-28 23:35:21.478: E/AndroidRuntime(5085):  at android.app.ActivityThread.main(ActivityThread.java:5017) 
08-28 23:35:21.478: E/AndroidRuntime(5085):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-28 23:35:21.478: E/AndroidRuntime(5085):  at java.lang.reflect.Method.invoke(Method.java:515) 
08-28 23:35:21.478: E/AndroidRuntime(5085):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
08-28 23:35:21.478: E/AndroidRuntime(5085):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
08-28 23:35:21.478: E/AndroidRuntime(5085):  at dalvik.system.NativeStart.main(Native Method) 

第一活動代碼

public class CasualEventsActivity extends Activity { 

    private static final String URL_WEB_SERVICE = "http://dooba.ca/analytics/casual.php"; 
    private GridView gv; 
    private ArrayList<Events_List> container; 
    private ArrayList<Events_List> items; 
    public Uri list_item_bac; 
    public String list_item_name; 
    public String list_item_description; 
    public String list_item_location; 
    public String single_list_item_description; 
    public String list_item_price; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.events_list_layout); 
     gv = (GridView) findViewById(R.id.gridview); 
     container = new ArrayList<Events_List>(); 
     //download JSON 
     listDownload(); 


     GridView s = (GridView) findViewById(R.id.gridview); 
     s.setOnItemClickListener(new OnItemClickListener(){ 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       Intent intent = new Intent(CasualEventsActivity.this,CasualEventsSingleItemActivity.class); 

       intent.putExtra("list_item_name", container.get(position).getList_item_title()); 
       intent.putExtra("list_item_location", container.get(position).getList_item_location()); 
       intent.putExtra("single_list_item_description", container.get(position).getSingle_list_item_description()); 
       startActivity(intent); //start Activity 
      } 
     }); 
    } 
    public void listDownload(){ 
     RequestQueue volley = Volley.newRequestQueue(this); 
     JsonObjectRequest json = new JsonObjectRequest(Method.GET, URL_WEB_SERVICE, null, ResponseListener(), ErrorListener()); 
     volley.add(json); 
    } 

    private Response.Listener<JSONObject> ResponseListener() { 
     return new Response.Listener<JSONObject>() { 
      @Override 
      public void onResponse(JSONObject response) { 
       try { 
        //your JSON Array 
        JSONArray array = response.getJSONArray("list_item"); 
        for(int i = 0; i < array.length(); i++){ 
         container.add(convertirAnuncio(array.getJSONObject(i))); 
        } 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
       gv.setAdapter(new AdapterEvents(getApplicationContext(),container)); 
       } 
      }; 
     }; 


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

    //object JSON 
    private final Events_List convertirAnuncio(JSONObject obj) throws JSONException { 
     long id = obj.getLong("id"); //id 
     String list_item_name = obj.getString("list_item_name"); 
     String list_item_location = obj.getString("list_item_location"); 
     String list_item_description = obj.getString("list_item_description"); 
     String single_list_item_description = obj.getString("single_list_item_description"); 
     Uri uri = Uri.parse(obj.getString("list_item_bac")); 
     return new Events_List(id, list_item_location, single_list_item_description,list_item_name,list_item_description,list_item_price, uri); 
    } 
} 

第二活動代碼

public class CasualEventsSingleItemActivity extends Activity { 

    // Declare Variables 
    String list_item_name; 
    String list_item_description; 
    String list_item_price; 
    String list_item_location; 

    String single_list_item_description; 




    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_events_single_item); 


     RequestQueue mRequestQueue = null; 
     ImageLoader mImageLoader = new ImageLoader(mRequestQueue, 
       new ImageLoader.ImageCache() { 
      private final LruCache<String, Bitmap> 
        cache = new LruCache<String, Bitmap>(20); 

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

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


     Intent i = getIntent(); 
     list_item_name = i.getStringExtra("list_item_name"); 
     list_item_location = i.getStringExtra("list_item_location"); 



     single_list_item_description = i.getStringExtra("single_list_item_description"); 

     TextView txtname = (TextView) findViewById(R.id.name); 
     TextView txtlocation = (TextView) findViewById(R.id.location); 
     TextView txtsdescription = (TextView) findViewById(R.id.sdescription); 


     NetworkImageView hsvimage1 = (NetworkImageView) findViewById(R.id.hsvimage1); 
     NetworkImageView hsvimage2 = (NetworkImageView) findViewById(R.id.hsvimage2); 
     NetworkImageView hsvimage3 = (NetworkImageView) findViewById(R.id.hsvimage3); 

     // Get image URLs from your previous network request... 
     // I could not determine where this is stored from code in your question. 
     String url1 = "I would want to populate the list_bac JSON string that links to a image URL"; // e.g. http://example.com/images/image1.png 
     String url2 = "I would want to populate the list_bac JSON string that links to a image URL"; 
     String url3 = "I would want to populate the list_bac JSON string that links to a image URL"; 

     // Set the URL of the image that should be loaded into this view, and 
     // specify the ImageLoader that will be used to make the request. 
     hsvimage1.setImageUrl(url1, mImageLoader); 
     hsvimage2.setImageUrl(url2, mImageLoader); 
     hsvimage3.setImageUrl(url3, mImageLoader); 


     // Set results to the TextViews 
     txtname.setText(list_item_name); 
     txtlocation.setText(list_item_location); 
     txtsdescription.setText(single_list_item_description); 


     Button mConfirm2 = (Button)findViewById(R.id.bConfirm2); 
     mConfirm2.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       ParseUser currentUser = ParseUser.getCurrentUser(); 

       // Create the class and the columns 
       currentUser.saveInBackground(); 

       currentUser.put("ActivityName", list_item_name); 
       currentUser.saveInBackground(new SaveCallback() { 
        @Override 
        public void done(ParseException e) { 
         setProgressBarIndeterminateVisibility(false); 

         if (e == null) { 
          // Success! 
          Intent intent = new Intent(CasualEventsSingleItemActivity.this, usermatch.class); 
          intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
          intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 
          startActivity(intent); 
         } 
         else { 
          AlertDialog.Builder builder = new AlertDialog.Builder(CasualEventsSingleItemActivity.this); 
          builder.setMessage(e.getMessage()) 
           .setTitle(R.string.signup_error_title) 
           .setPositiveButton(android.R.string.ok, null); 
          AlertDialog dialog = builder.create(); 
          dialog.show(); 
         } 
        } 
       }); 
       //CasualEventsSingleItemActivity.this.startActivity(new Intent(CasualEventsSingleItemActivity.this, MatchingActivity.class)); 
      } 
     }); 









    } 

第二活動佈局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
     android:background="@drawable/blue_bac3" 
    android:gravity="center" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/name" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     android:layout_marginLeft="15dp" 
     android:layout_marginTop="10dp" 

     android:layout_marginRight="15dp" 
     android:alpha="0.9" 
     android:paddingBottom="3dp" 
     android:shadowColor="#000000" 
     android:shadowDx="3" 
     android:shadowDy="3" 
     android:shadowRadius="0.01" 
     android:textColor="#82CAFF" 
     android:textSize="24sp" /> 

    <TextView 
     android:id="@+id/location" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/name" 
     android:layout_centerHorizontal="true" 
     android:layout_marginLeft="15dp" 
     android:layout_marginRight="15dp" 
     android:alpha="0.8" 
     android:paddingBottom="5dp" 
     android:shadowColor="#000000" 
     android:shadowDx="3" 
     android:shadowDy="3" 
     android:shadowRadius="0.01" 
     android:textAlignment="center" 
     android:textColor="#f2f2f2" 
     android:textSize="16sp" /> 

    <ImageView 
     android:id="@+id/dividertop" 
     android:layout_width="370dp" 
     android:layout_centerHorizontal="true" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/location" 
     android:alpha="0.6" 
     android:background="@drawable/divider11" 
     android:paddingBottom="3dp" /> 

    <ImageView 
     android:id="@+id/dividerbottom" 
     android:layout_width="370dp" 
       android:layout_centerHorizontal="true" 

     android:layout_height="wrap_content" 
     android:layout_below="@+id/vsvdescription" 
     android:alpha="0.6" 
     android:background="@drawable/divider11" 
     android:paddingBottom="3dp" /> 

    <ImageView 
     android:id="@+id/image_head" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:background="#000000" 
     android:padding="1dp" /> 

    <HorizontalScrollView 
     android:id="@+id/isgallery" 
     android:layout_width="370dp" 
     android:layout_height="90dp" 
     android:layout_centerHorizontal="true" 
     android:layout_below="@+id/dividerbottom" 
     android:layout_marginTop="8dp" 
     > 

      <LinearLayout 
       android:orientation="horizontal" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" > 

       <com.android.volley.toolbox.NetworkImageView 
       android:id="@+id/hsvimage1" 
       android:layout_width="148dp" 
       android:layout_height="90dp" 
       android:layout_marginRight="6dp" 
       android:layout_alignParentRight="true" 
       android:background="#fff" 
       android:padding="1dp" /> 
       <com.android.volley.toolbox.NetworkImageView 
       android:id="@+id/hsvimage2" 
       android:layout_width="148dp" 
       android:layout_height="90dp" 
       android:layout_marginRight="6dp" 
       android:layout_alignParentRight="true" 
       android:background="#000000" 
       android:padding="1dp" /> 
       <com.android.volley.toolbox.NetworkImageView 
       android:id="@+id/hsvimage3" 
       android:layout_width="148dp" 
       android:layout_height="90dp" 
       android:layout_marginRight="6dp" 
       android:layout_alignParentRight="true" 
       android:background="#CCC" 
       android:padding="1dp" /> 
       <com.android.volley.toolbox.NetworkImageView 
       android:id="@+id/hsvimage4" 
       android:layout_width="148dp" 
       android:layout_height="90dp" 
       android:layout_alignParentRight="true" 
       android:background="#000000" 
       android:padding="1dp" /> 
         </LinearLayout> 

        </HorizontalScrollView> 

    <Button 
     android:id="@+id/bConfirm2" 
     android:layout_width="90dp" 
     android:layout_height="50dp" 
     android:layout_below="@+id/isgallery" 
     android:layout_centerHorizontal="true" 
     android:alpha="0.7" 
     android:layout_marginTop="10dp" 
     android:background="@drawable/gray_bac" 
     android:text="Confirm" 
     android:textColor="#2B3856" 
     android:textStyle="bold" /> 

    <ScrollView 
     android:id="@+id/vsvdescription" 
     android:layout_width="370dp" 
     android:layout_height="250dp" 
     android:layout_marginTop="7dp" 
     android:layout_marginBottom="7dp" 
     android:padding="5dp"  

     android:layout_centerHorizontal="true" 
     android:layout_below="@+id/dividertop" 
     > 

      <RelativeLayout 
       android:orientation="vertical" 
       android:gravity="center" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" > 

    <TextView 
     android:id="@+id/sdescription" 
     android:layout_width="370dp" 
     android:layout_height="250dp" 
     android:gravity="center" 
     android:alpha="0.65" 
     android:textColor="#ffffff" 
     android:textSize="18sp" /> 

    </RelativeLayout> 
    </ScrollView> 

</RelativeLayout> 

在此先感謝

更新

public class CasualEventsSingleItemActivity extends Activity { 

    // Declare Variables 
    String list_item_name; 
    String list_item_description; 
    String list_item_price; 
    String list_item_location; 

    String single_list_item_description; 




    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_events_single_item); 


     ImageLoader mImageLoader = new ImageLoader(Volley.newRequestQueue(this), 
       new ImageLoader.ImageCache() { 
      private final LruCache<String, Bitmap> 
        cache = new LruCache<String, Bitmap>(20); 

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

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


     Intent i = getIntent(); 
     list_item_name = i.getStringExtra("list_item_name"); 
     list_item_location = i.getStringExtra("list_item_location"); 



     single_list_item_description = i.getStringExtra("single_list_item_description"); 

     TextView txtname = (TextView) findViewById(R.id.name); 
     TextView txtlocation = (TextView) findViewById(R.id.location); 
     TextView txtsdescription = (TextView) findViewById(R.id.sdescription); 


     NetworkImageView hsvimage1 = (NetworkImageView) findViewById(R.id.hsvimage1); 
     NetworkImageView hsvimage2 = (NetworkImageView) findViewById(R.id.hsvimage2); 
     NetworkImageView hsvimage3 = (NetworkImageView) findViewById(R.id.hsvimage3); 

     // Get image URLs from your previous network request... 
     // I could not determine where this is stored from code in your question. 
     String url1 = "list_item_bac"; // e.g. http://example.com/images/image1.png 
     String url2 = "list_item_bac"; 
     String url3 = "list_item_bac "; 

     // Set the URL of the image that should be loaded into this view, and 
     // specify the ImageLoader that will be used to make the request. 
     hsvimage1.setImageUrl(url1, mImageLoader); 
     hsvimage2.setImageUrl(url2, mImageLoader); 
     hsvimage3.setImageUrl(url3, mImageLoader); 

     // Set results to the TextViews 
     txtname.setText(list_item_name); 
     txtlocation.setText(list_item_location); 
     txtsdescription.setText(single_list_item_description); 


     Button mConfirm2 = (Button)findViewById(R.id.bConfirm2); 
     mConfirm2.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       ParseUser currentUser = ParseUser.getCurrentUser(); 

       // Create the class and the columns 
       currentUser.saveInBackground(); 

       currentUser.put("ActivityName", list_item_name); 
       currentUser.saveInBackground(new SaveCallback() { 
        @Override 
        public void done(ParseException e) { 
         setProgressBarIndeterminateVisibility(false); 

         if (e == null) { 
          // Success! 
          Intent intent = new Intent(CasualEventsSingleItemActivity.this, usermatch.class); 
          intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
          intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 
          startActivity(intent); 
         } 
         else { 
          AlertDialog.Builder builder = new AlertDialog.Builder(CasualEventsSingleItemActivity.this); 
          builder.setMessage(e.getMessage()) 
           .setTitle(R.string.signup_error_title) 
           .setPositiveButton(android.R.string.ok, null); 
          AlertDialog dialog = builder.create(); 
          dialog.show(); 
         } 
        } 
       }); 
       //CasualEventsSingleItemActivity.this.startActivity(new Intent(CasualEventsSingleItemActivity.this, MatchingActivity.class)); 
      } 
     }); 









    } 
} 

回答

2

嗯,這是你在哪裏得到您的NPE

* Constructs a new ImageLoader. 
    * @param queue The RequestQueue to use for making image requests. 
    * @param imageCache The cache to use as an L1 cache. 
    */ 
    public ImageLoader(RequestQueue queue, ImageCache imageCache) { 
     mRequestQueue = queue; 
     mCache = imageCache; 
    } 

那麼,爲什麼你傳遞一個null作爲第一個參數的代碼?

Also as per the code 
/** 
* Helper that handles loading and caching images from remote URLs. 
* 
* The simple way to use this class is to call {@link ImageLoader#get(String, ImageListener)} 
* and to pass in the default image listener provided by 
* {@link ImageLoader#getImageListener(ImageView, int, int)}. Note that all function calls to 
* this class must be made from the main thead, and all responses will be delivered to the main 
* thread as well. 
*/ 

所以我會拿自己的建議,使用ImageLoader.get (String requestUrl, final ImageListener listener)

+0

感謝您的及時回覆和幫助我解決我的問題與空指針。另一個相關的問題,我已經解決了通過JSON數據顯示圖像,而不是有String url3 =「image.com/image.png」,我會有String url3 =「list_image1」;,其中list_image1引用JSON字符串鏈接到圖片網址,以及可以在哪裏找到JSON鏈接,例如website.com/json.php我已在我的初始文章的更新部分下添加了更新後的代碼。如果你能夠善意地研究它,那將會有所幫助。謝謝 – John 2014-08-29 02:52:30