_NullReferenceException_ после завершения фрагмента Android, AsyncTask - PullRequest
0 голосов
/ 01 сентября 2011

Я сейчас пытаюсь заполнить фрагмент асинхронной задачей. Это в основном упражнение, так как реальная реализация извлекает данные из базы данных SQLite - однако мне нужно реализовать синхронизацию GSON / SOAP в какое-то время - и я думаю, что проблема остается прежней.

Я не могу заполнить свой FragmentList после того, как получаю все данные из веб-службы, я получаю исключение NullReferenceException - но я не могу действительно найти свою ошибку.

Я не получаю исключения, если веб-служба не возвращает никаких данных.

На сайте Sitenote - почему Android снова связывается с веб-сервисом, когда я меняю ориентацию телефона

public class ClosestPlaces extends FragmentActivity {

private static KantinenListe kantinen;



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    requestWindowFeature(Window.FEATURE_ACTION_BAR);        
    setContentView(R.layout.kantinen_results);

}   

/**
 * This is the "top-level" fragment, showing a list of items that the
 * user can pick.  Upon picking an item, it takes care of displaying the
 * data to the user as appropriate based on the currrent UI layout.
 */

public static class TitlesFragment extends ListFragment {
    boolean mDualPane;
    int mCurCheckPosition = 0;


    private class BuildKantinen extends AsyncTask<String, Integer, KantinenListe>   {

        private KantinenListe kantinen;


        @Override
        protected KantinenListe doInBackground(String... params) {
            try{

                Gson gson = new Gson();             
                // SOAP Test
                String NAMESPACE = "http://tempuri.org/";
                String METHOD_NAME = "fullSyncGPS";
                String SOAP_ACTION = "http://tempuri.org/IDatenService/fullSyncGPS";
                String URL = "http://webserviceURL?wsdl";

                SoapObject request = new SoapObject(NAMESPACE,METHOD_NAME);

                PropertyInfo pi = new PropertyInfo();
                request.addProperty("radius",10);
                request.addProperty("lat", "14.089201");
                request.addProperty("lng", "02.136459");
                request.addProperty("von", "01.09.2011");
                request.addProperty("bis", "01.09.2011");

                SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
                envelope.dotNet = true;
                envelope.setOutputSoapObject(request);        

                HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
                androidHttpTransport.call(SOAP_ACTION, envelope);
                SoapPrimitive result = (SoapPrimitive)envelope.getResponse();

                String resultData = result.toString(); 


                resultData = "{\"meineKantinen\":"+resultData+"}";
                this.kantinen = gson.fromJson(resultData, KantinenListe.class);
                Log.i("test", "blubber" );
            }
            catch(Exception e)
            {
                 e.printStackTrace();
            }
                return this.kantinen;

        }

        @Override
        protected void onPostExecute(KantinenListe result) {
            // populate the List with the data
            Log.i("test", "postexecute" );
            setListAdapter( new MenuAdapter(getActivity(), R.layout.simple_list_item_checkable_1, kantinen.getMeineKantinen()));
        }
    }


    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        new BuildKantinen().execute("test");                       

        if (savedInstanceState != null) {
            // Restore last state for checked position.
            mCurCheckPosition = savedInstanceState.getInt("curChoice", 0);
        }
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt("curChoice", mCurCheckPosition);
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        showDetails(position);            
    }

    /**
     * Helper function to show the details of a selected item, either by
     * displaying a fragment in-place in the current UI, or starting a
     * whole new activity in which it is displayed.
     */
    void showDetails(int index) {
        mCurCheckPosition = index;

            // Otherwise we need to launch a new activity to display
            // the dialog fragment with selected text.
            Log.i("Test",Integer.toString(index));
            Intent intent = new Intent();
            intent.setClass(getActivity(), BeAPartner.class);
            startActivity(intent);
    }
}

public static class MenuAdapter extends ArrayAdapter {

    private LayoutInflater mInflater;
    private List<Kantine> items;
    private Context context;

    public MenuAdapter(Context context, int textViewResourceId, List<Kantine> items) {
        super(context, textViewResourceId);
        mInflater = LayoutInflater.from(context);
        this.items = items;
        this.context = context;
    }

    @Override
    public int getCount() {
        return items.size();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;

        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.menu_row, parent, false);
            holder = new ViewHolder();
            holder.color = (TextView) convertView.findViewById(R.id.color);
            holder.title = (TextView) convertView.findViewById(R.id.detail);
            holder.subdetail = (TextView) convertView.findViewById(R.id.subdetail);

            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        // Fill in the actual story info
        Kantine s = items.get(position);

        s.setName( Html.fromHtml(s.getName()).toString() );
        if (s.getName().length() > 35)
            holder.title.setText(s.getName().substring(0, 32) + "...");
        else
            holder.title.setText(s.getName());

        Log.i("display", "Here I am");
        return convertView;
    }


 }
    static class ViewHolder {
        TextView color;
        TextView title;
        TextView subdetail;
    }   

}

LogCat говорит следующее:

 09-01 17:16:31.830: INFO/test(2104): postexecute
 09-01 17:16:31.830: DEBUG/AndroidRuntime(2104): Shutting down VM
 09-01 17:16:31.830: WARN/dalvikvm(2104): threadid=1: thread exiting with uncaught exception (group=0x40243560)
 09-01 17:16:31.830: ERROR/AndroidRuntime(2104): FATAL EXCEPTION: main
 09-01 17:16:31.830: ERROR/AndroidRuntime(2104): java.lang.NullPointerException
 09-01 17:16:31.830: ERROR/AndroidRuntime(2104):     at com.$TitlesFragment$BuildKantinen.onPostExecute(ClosestPlaces.java:117)
 09-01 17:16:31.830: ERROR/AndroidRuntime(2104):     at      com..ClosestPlaces$TitlesFragment$BuildKantinen.onPostExecute(ClosestPlaces.java:1)
 09-01 17:16:31.830: ERROR/AndroidRuntime(2104):     at      android.os.AsyncTask.finish(AsyncTask.java:417)
 09-01 17:16:31.830: ERROR/AndroidRuntime(2104):     at                     android.os.AsyncTask.access$300(AsyncTask.java:127)
 09-01 17:16:31.830: ERROR/AndroidRuntime(2104):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429)
 09-01 17:16:31.830: ERROR/AndroidRuntime(2104):     at android.os.Handler.dispatchMessage(Handler.java:99)
 09-01 17:16:31.830: ERROR/AndroidRuntime(2104):     at android.os.Looper.loop(Looper.java:123)
 09-01 17:16:31.830: ERROR/AndroidRuntime(2104):     at android.app.ActivityThread.main(ActivityThread.java:3835)
 09-01 17:16:31.830: ERROR/AndroidRuntime(2104):     at java.lang.reflect.Method.invokeNative(Native Method)
 09-01 17:16:31.830: ERROR/AndroidRuntime(2104):     at java.lang.reflect.Method.invoke(Method.java:507)
 09-01 17:16:31.830: ERROR/AndroidRuntime(2104):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
 09-01 17:16:31.830: ERROR/AndroidRuntime(2104):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
 09-01 17:16:31.830: ERROR/AndroidRuntime(2104):     at dalvik.system.NativeStart.main(Native Method)

1 Ответ

1 голос
/ 02 сентября 2011

В коде вы ничего не делаете, а просто печатаете трассировку стека при обнаружении исключения.Ваш doInBackground () всегда возвращает кантинен.Вы должны изучить и обработать NULL-ситуацию в вашем onPostExecute ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...