Я сейчас пытаюсь заполнить фрагмент асинхронной задачей. Это в основном упражнение, так как реальная реализация извлекает данные из базы данных 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)