我正在使用flickr的API,该API显示了最近的照片。但是该应用程序崩溃了。有人可以帮助我度过难关。我只是在看这本书,但仍然出现错误:
MainFragment.java
package com.example.photogallery;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.GridView;
import java.util.ArrayList;
public class Mainfragment extends Fragment {
GridView mGrid;
ArrayList<GalleryItem> mItems;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
new FetchItemsTask().execute();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState)
{
View v=inflater.inflate(R.layout.activity_main,container,false);
mGrid=(GridView)v.findViewById(R.id.gridview);
setupAdapter();
return v;
}
private class FetchItemsTask extends AsyncTask<Void,Void,ArrayList<GalleryItem>>
{
@Override
protected ArrayList<GalleryItem> doInBackground(Void... params)
{
return (new FlickrFetchr().fetchItems());
}
@Override
protected void onPostExecute(ArrayList<GalleryItem> items)
{
mItems=items;
setupAdapter();
}
}
void setupAdapter()
{
if(mGrid==null || getActivity()==null)
return;
if(mItems !=null)
{
mGrid.setAdapter(new ArrayAdapter<GalleryItem>(getActivity(),android.R.layout.simple_gallery_item,mItems));
}
else{
mGrid.setAdapter(null);
}
}
}
GalleryItem.java
package com.example.photogallery;
public class GalleryItem {
private String mCaption;
private String mId;
private String mUrl;
public void setCaption(String cap)
{
mCaption=cap;
}
public void setid(String id)
{
mId=id;
}
public void seturl(String url)
{
mUrl=url;
}
public String getcaption()
{return mCaption;}
public String getid()
{return mId;
}
public String geturl()
{return mUrl;}
public String toString()
{
return mCaption;
}
}
FlickrFetchr.java
package com.example.photogallery;
import android.net.Uri;
import android.util.Log;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import java.lang.reflect.Array;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
public class FlickrFetchr {
public static final String TAG="FlickrFetchr";
public static final String ENDPOINT="http://api.flickr.com/services/rest/";
public static final String API_KEY="xxx";
public static final String METHOD_GET_RECENT="flickr.photos.getRecent";
public static final String PARAMS_EXTRAS="extras";
public static final String EXTRA_SMALL_URL="url_s";
private static final String XML_PHOTO="photo";
byte[] getUrlBytes(String urlSpec)throws IOException
{
URL url =new URL(urlSpec);
HttpURLConnection conn= (HttpURLConnection)url.openConnection();
try
{
ByteArrayOutputStream out=new ByteArrayOutputStream();
InputStream in=conn.getInputStream();
if(conn.getResponseCode()!= HttpURLConnection.HTTP_OK){
return null;
}
int bytesRead=0;
byte[] buffer =new byte[1024];
while((bytesRead=in.read(buffer))>0)
{
out.write(buffer,0,bytesRead);
}
out.close();
return out.toByteArray();
}
finally {
conn.disconnect();
}
}
public String getUrl(String urlSpec)throws IOException
{
return new String(getUrlBytes(urlSpec));
}
public ArrayList<GalleryItem> fetchItems()
{
ArrayList<GalleryItem> items=new ArrayList<GalleryItem>();
try{
String url= Uri.parse(ENDPOINT).buildUpon().appendQueryParameter("method",METHOD_GET_RECENT).appendQueryParameter("api_key",API_KEY).appendQueryParameter(PARAMS_EXTRAS,EXTRA_SMALL_URL).build().toString();
String xmlString=getUrl(url);
XmlPullParserFactory factory=XmlPullParserFactory.newInstance();
XmlPullParser parser=factory.newPullParser();
parser.setInput(new StringReader(xmlString));
parseItems(items,parser);
}
catch(IOException ioe)
{
Log.e(TAG,"Failed",ioe);
}
catch(XmlPullParserException xppe)
{}
return items;
}
void parseItems(ArrayList<GalleryItem> items, XmlPullParser parser)throws XmlPullParserException,IOException
{
int eventType=parser.next();
while(eventType!=XmlPullParser.END_DOCUMENT)
{
if((eventType == XmlPullParser.START_TAG) && XML_PHOTO.equals(parser.getName()))
{
String id=parser.getAttributeValue(null,"id");
String caption=parser.getAttributeValue(null,"title");
String smallUrl=parser.getAttributeValue(null,EXTRA_SMALL_URL);
GalleryItem item=new GalleryItem();
item.setid(id);
item.setCaption(caption);
item.seturl(smallUrl);
items.add(item);
}
eventType=parser.next();
}
}
}
MainActivity.java
public class MainActivity extends SingleFragmentActivity {
@Override
public Fragment createFragment()
{
return new Mainfragment();
}
SingleFragmentActivity.java
package com.example.photogallery;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.List;
public abstract class SingleFragmentActivity extends FragmentActivity {
protected abstract Fragment createFragment();
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fragment);
FragmentManager fm=getSupportFragmentManager();
Fragment fragment=fm.findFragmentById(R.id.fragmentContainer);
if(fragment==null)
{
fragment=createFragment();
fm.beginTransaction().add(R.id.fragmentContainer,fragment).commit();
}
}
}
这是logcat:
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:353)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
at java.util.concurrent.FutureTask.run(FutureTask.java:271)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:764)
Caused by: java.lang.NullPointerException: Attempt to get length of null array
at java.lang.StringFactory.newStringFromBytes(StringFactory.java:46)
at com.example.photogallery.FlickrFetchr.getUrl(FlickrFetchr.java:64)
at com.example.photogallery.FlickrFetchr.fetchItems(FlickrFetchr.java:73)
at com.example.photogallery.Mainfragment$FetchItemsTask.doInBackground(Mainfragment.java:53)
at com.example.photogallery.Mainfragment$FetchItemsTask.doInBackground(Mainfragment.java:44)
at android.os.AsyncTask$2.call(AsyncTask.java:333)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
... 4 more