Question

Je suis un vrai noob quand il s'agit de Java et de la programmation orientée objet en général.Je vais avoir des problèmes avec mon application crash et je pense que c'est parce que mon Activité Principale est encombré et l'ensemble de mon programme n'est pas structurée de manière appropriée.Quelqu'un peut-il me conseiller sur la façon de nettoyer le code suivant pour faire fonctionner plus lisse et une meilleure application de la structure?Je pense que j'ai besoin de séparer les choses en différentes classes et de garder la plupart des fonctions dans des classes différentes, mais je suis nouveau et vraiment pas sûr.Je reçois une ANR erreur quand je lance l'application sur un téléphone (keyDispatchingTimedOut erreur) et je pense que ma non-syndiqués code qui est à l'origine.Toute aide serait super!Merci.

    package com.example.www;

public class MainActivity extends Activity {

    Button mCloseButton;
    Button mOpenButton;
    MultiDirectionSlidingDrawer mDrawer;

    private Button send_button;
    EditText msgTextField;

    private LocationManager locManager;
    private LocationListener locListener;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature( Window.FEATURE_NO_TITLE );
        setContentView(R.layout.main);

        mDrawer.open();

        final SharedPreferences shared = getSharedPreferences("PEOPLE_PREFERENCES", MODE_PRIVATE);
        final String phone = shared.getString("PHONE", "");

        String usr_id = shared.getString("USR_ID", null);

        if(phone == null) {
            TextView text = (TextView)findViewById(R.id.textView1); 
            text.setText("Please Enter Your Phone Number");

            AlertDialog.Builder alert = new AlertDialog.Builder(this);

            alert.setTitle("Please Enter Your Phone Number");
            alert.setMessage("You must enter your phone number in order to use this application");

            final EditText input = new EditText(this);
            alert.setView(input);

            alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
                String value = input.getText().toString();
                if (value.length() == 10) {
                    Editor editor = shared.edit();
                    editor.putString("PHONE", value);
                    editor.commit();
                }
             }
            });
            alert.show();     
        }

        Button profile = (Button) findViewById(R.id.button1);
        profile.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, PreferencesActivity.class));
            }
        });



        if (usr_id == null) {

            char[] chars = "abcdefghijklmnopqrstuvwxyzABSDEFGHIJKLMNOPQRSTUVWXYZ1234567890".toCharArray();
            Random r = new Random(System.currentTimeMillis());
            char[] id = new char[8];
            for (int i = 0;  i < 8;  i++) {
                id[i] = chars[r.nextInt(chars.length)];
            }
            usr_id = new String(id);
            Editor editor = shared.edit();
            editor.putString("USR_ID", usr_id);
            editor.commit();
        }

        final String usr_id1 = shared.getString("USR_ID", "none");

        send_button = (Button)findViewById(R.id.button2);

        send_button.setOnClickListener(new OnClickListener() {
            private boolean running = false;
            private CountDownTimer timer;
            public void onClick(View v) {
              if(!running)
              {
                running = true;
                timer = new CountDownTimer(4000, 1000) {

                    @Override
                    public void onFinish() {
                        send_button.setText("GPS Sent");  
                        startLocation();
                        sendId(usr_id1, phone);
                    }

                    @Override
                    public void onTick(long sec) {
                        send_button.setText("CANCEL (" + sec / 1000 + ")");

                    }
                }.start();
              }
              else
              {
                 timer.cancel();
                 send_button.setText("Send GPS");
                 running = false;
              }
            }
        });
    }  


    private void startLocation()
    {

        //get a reference to the LocationManager
        locManager = 
            (LocationManager)getSystemService(Context.LOCATION_SERVICE);

        //get the last known position
        Location loc = 
            locManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

        //show the last known position
        //showPosition(loc);

        //checked to receive updates from the position
        locListener = new LocationListener() {
            public void onLocationChanged(Location location) {
                showPosition(location);
            }
            public void onProviderDisabled(String provider){
                //labelState.setText("Provider OFF");
            }
            public void onProviderEnabled(String provider){
                //labelState.setText("Provider ON ");
            }
            public void onStatusChanged(String provider, int status, Bundle extras){
                //Log.i("", "Provider Status: " + status);
                //labelState.setText("Provider Status: " + status);
            }
        };

        locManager.requestLocationUpdates(
                LocationManager.GPS_PROVIDER, 0, 0, locListener);
    }

    private void showPosition(Location loc) {
        if(loc != null)
        {

            Log.i("", String.valueOf(loc.getLatitude() + " - " + String.valueOf(loc.getLongitude())));

            send(loc);
        }

    }

    private void send(Location loc)
    {
         String lat = String.valueOf(loc.getLatitude()); 
         String lon = String.valueOf(loc.getLongitude());

        SharedPreferences shared = getSharedPreferences("PEOPLE_PREFERENCES", MODE_PRIVATE);
        final String usr_id2 = shared.getString("USR_ID", "none");

        if (lat != "0" && lon != "0")   
        {
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost("http://example.com/test/example1.php");
            //HttpPost httppost = new HttpPost("http://kblapdesk.com/myers27/receive.php");
         try {
           List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); //changed to 4
           nameValuePairs.add(new BasicNameValuePair("lat", lat)); //changed "message" to "lat" changed "msg" to "lat"
           nameValuePairs.add(new BasicNameValuePair("lon", lon)); //added this line
           nameValuePairs.add(new BasicNameValuePair("id", usr_id2));
           httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
           httpclient.execute(httppost);
         } catch (ClientProtocolException e) {
             // TODO Auto-generated catch block
         } catch (IOException e) {
             // TODO Auto-generated catch block
         }

        }
        else
        {
            // display message if text fields are empty
            Toast.makeText(getBaseContext(),"All field are required",Toast.LENGTH_SHORT).show();
        }

    }

    private void sendId(String usr_id1, String phone)
    {
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost("http://example.com/test/example.php");
            //HttpPost httppost = new HttpPost("http://kblapdesk.com/myers27/receive_user.php");
         try {
           List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); //changed to 4

           nameValuePairs.add(new BasicNameValuePair("id", usr_id1));

           httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
           httpclient.execute(httppost);
           //msgTextField.setText(""); // clear text box
         } catch (ClientProtocolException e) {
             // TODO Auto-generated catch block
         } catch (IOException e) {
             // TODO Auto-generated catch block
         }

        mCloseButton.setOnClickListener( new OnClickListener() {
            public void onClick( View v )
            {
                mDrawer.animateClose();
            }
        });

        mOpenButton.setOnClickListener( new OnClickListener() {

            public void onClick( View v )
            {
                if( !mDrawer.isOpened() )
                    mDrawer.animateOpen();
            }
        });
    }

    @Override
   public void onContentChanged()
   {
    super.onContentChanged();
    mCloseButton = (Button) findViewById( R.id.button_open );
    mOpenButton = (Button) findViewById( R.id.button_open );
    mDrawer = (MultiDirectionSlidingDrawer) findViewById( R.id.drawer );
   }
}
Était-ce utile?

La solution

Je résumerait le LocationListener dans un tout autre classe.Qui devrait raccourcir la majeure partie de votre code et de vous laisser avec un simple morceau de travailler avec.

En outre, vous semblez avoir quelques HTTP post ou web-méthodes de demande dans votre MainActivity.Prendre et les mettre dans une autre catégorie.Nom de quelque chose comme ActivityServer ou quelque chose de semblable à cela.

Dans votre ActivityServer de la classe, vous devriez faire un rappel et interfaces asynchrones afin de ne pas bloquer le thread de l'INTERFACE utilisateur lorsque vous faites des demandes web.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top