0

I have abit of a problem. I have a main class (MyActivity) in which the user select a location from a spinner. When the user selected an item this should trigger a Async method which then returns the data in form of a measurement(which includes temp, winddirection and more).

Ive got the spinner and the Async task to start as they should. My problem is, how should i get the measurment back so i can read it in the MyActivity and place the data in som TextViews. A thing i tried is tho use the method setTextView from the Async task (onPostExecute) but then i got a Null exception syaing that the TextView isnt set up yet.

Code for MyActivity :

public class MyActivity extends Activity {

//Activity which basicly is the GUI. The user can click the menu button to configure widgets from here.
//TODO: Daniel add some fancy wind graphs
TextView txt_spotName;
TextView txt_spotTemp;
TextView txt_spotWind;
Measurement measurement2;
public Boolean b;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    txt_spotName = (TextView) findViewById(R.id.txt_spotName);
    txt_spotTemp = (TextView) findViewById(R.id.txt_spotTemp);
    txt_spotWind = (TextView) findViewById(R.id.txt_spotWindDir);


    final Spinner spotChooser = (Spinner) findViewById(R.id.spin_spotvelger);
    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.spots, android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spotChooser.setAdapter(adapter);

    spotChooser.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> adapterView, View view, int pos, long l) {

            //User selected a value in the spinner
            //String s = String.valueOf(pos);
            String spotName = (String) spotChooser.getItemAtPosition(pos);



            Spots spots = new Spots();
            spotName = spots.getSpotIdFromName(spotName);
            //spotName now equals the ID instead of the Name
            //Call the updateNow function with the ID and a debug parameter.
            VindsidenUpdateService vindsidenUpdateService = new VindsidenUpdateService();
            vindsidenUpdateService.updateNow(spotName, "user");

            //Here the code shoud somehow wait untill "measurement2" is set by the Async task.
            //My biggest issue that i dont know how to do this code right.



            try {
                txt_spotName.setText(measurement2.getStationID());

            } catch (Exception e) {


            }


        }

        @Override
        public void onNothingSelected(AdapterView<?> adapterView) {

        }
    });

}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu, menu);
    return true;

}


public void setTextView (String s ){
    //This should in theory work but i cant get it to setText.
    //The error i get is basicly that "txt_spotname" = null
    txt_spotName.setText(s);
}

//OnOptionsItemSelected is called when user clicks the menu/overflow button
@Override
public boolean onOptionsItemSelected(MenuItem menuItem) {

    //Switch case to check which menu item user clicked
    switch (menuItem.getItemId()) {

        case R.id.settings:
            //Define settings page to be com.vindsiden.windwidget/.Settings
            String SettingsPage = "com.vindsiden.windwidget/.Settings";

            try {
                Intent intent = new Intent(Intent.ACTION_MAIN);
                intent.setComponent(ComponentName.unflattenFromString(SettingsPage));
                intent.addCategory(Intent.CATEGORY_LAUNCHER);
                startActivity(intent);
            } catch (ActivityNotFoundException e)

            {
                //This will be called when activity is not found (Check manifest)
                Log.d("", e.getStackTrace().toString());
            }

            break;

        case R.id.About:
            About.Show(this);


            //TODO : Add featurerequest/send email to developer
            //http://stackoverflow.com/questions/2197741/how-to-send-email-from-my-android-application


    }
    return true;


}


}

Code for Async Class :

public class VindsidenUpdateService {


private static final String NEXT_SCHEDULE_URI_POSTFIX = "/next_schedule";
private static final String WIDGET_URI_PREFIX = "/widget_id/";
List<Measurement> measurements = null;

public void updateNow(String stationID, String from) {
    //upDateNow is just used to call the GetData method

    //stationID = "1";
    try {

        if (stationID.equals("")) {
            //Actually used for debugging
            stationID = "1";

        }

      //Start the GetData
        String[] input = {String.valueOf(stationID), from};
        new GetData().execute(input);


    } catch (Exception e) {
        Log.d("Vindsiden2" + " UpdateNow", "Failed");


    }


}


class GetData extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... data) {

        String s = data.toString();
        Log.d("Vindsiden2 + Convert array to string", s);

        try {
            String urlString = WindWidgetConfig.getVindsidenUrlPrefix() + data[0].toString()
                    + WindWidgetConfig.getVindsidenUrlPostfix();
            Log.d("Vindsiden2", urlString);
            measurements = (new VindsidenWebXmlReader()).loadXmlFromNetwork(urlString);
            Log.d("Vindsiden2", measurements.toString());
            //Filldata here


        } catch (IOException e) {
            Log.d("Vindsiden2", "An IO exception occured. Stack follows: ");
            Log.d("Vindsiden2", e.getStackTrace().toString());
            // xmlRetrievalSuccessful = false;
            // not certain how robust throwing a runtime exception is, might break stuff with recurrence etc!
            // throw new RuntimeException(getResources().getString(R.string.connection_error));
        } catch (XmlPullParserException e) {
            Log.d("Vindsiden", "An XmlPullParserException occured. Stack follows: ");
            Log.d("Vindsiden", e.getStackTrace().toString());
            //xmlRetrievalSuccessful = false;
            // throw new RuntimeException(getResources().getString(R.string.xml_error));
        }
        Log.d("Vindsiden ", "Got data, now find measurment");

        String Return = "";
        int array = data.length;

        if (array == 1) {
            //stop
            Return = "";


        } else if (array == 2) {
            Return = data[1].toString();
        }


        return Return;
    }


    protected void onPostExecute(String result) {

        //   fillData(measurements);
        MyActivity myActivity = new MyActivity();
        myActivity.measurement2 = measurements.get(0);
        //ive also tried to create a setTextView method in MyActivity but this dosent seem to work either.
        //Commect

    }


}


}

The full code is avalible at : https://github.com/danielgolan/Vindsiden/tree/Daniel2

Dukes
  • 342
  • 1
  • 3
  • 14
  • 1
    use a interface as a call back to the activity – Raghunandan Jan 17 '14 at 09:21
  • 1
    Try using the AsyncTask as a nested class in your activity, then you can make sure it is called after onCreate. Right now you are making an instance of that activity which you probably don't wanna do. – hypd09 Jan 17 '14 at 09:22
  • @hypd09 Thanks ! Ill try that. Could i then use setText on a TextView directly ? So that the spinner starts the async and then inflates the TextView onComplete. – Dukes Jan 17 '14 at 09:34

0 Answers0