无法找出网络Android应用程序中的错误

时间:2019-06-16 11:08:06

标签: android network-programming

我正在使用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

0 个答案:

没有答案