java - 清理 Android 主要 Activity 代码

标签 java android oop main-activity

对于 Java 和 OOP,我是一个真正的菜鸟。我的应用程序崩溃时遇到问题,我认为这是因为我的主要 Activity 困惑并且我的整个程序结构不正确。谁能建议我如何清理以下代码以使事情运行更顺畅并拥有更好的应用程序结构?我认为我需要将事物分成不同的类,并将大部分功能保留在不同的类中,但我是新手,真的不确定。当我在手机上运行应用程序时,我不断收到 ANR 错误(keyDispatchingTimedOut 错误),我认为是我的无组织代码导致了此问题。任何帮助都会很棒!谢谢。

    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 );
   }
}

最佳答案

我会将LocationListener封装在一个完全不同的类中。这应该会缩短大部分代码,并为您留下可管理的代码块。

此外,您的 MainActivity 中似乎有一些 HTTP post 或 web 请求方法。把它们拿出来并把它们放在不同的类(class)中。将其命名为 ActivityServer 或类似的名称。

在您的 ActivityServer 类中,您应该创建回调和异步接口(interface),以便在执行 Web 请求时不会阻塞 UI 线程。

关于java - 清理 Android 主要 Activity 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9476754/

相关文章:

java - 纹理浮桥 - 旋转问题

android - 为什么来自不同项目的应用程序模块出现在我当前的 Android Studio 项目中?

php - 在 map 中自动移动

java - 在命令行上运行模块会出现错误 : Module target not found

java - 拦截每个被膨胀的 View 元素?

python - 如何在Python中从现有的父类(super class)类型对象实例化子类类型变量

java - 具有相同方法名称的两个接口(interface) - 方法的实现

Java - Tomcat GC 不会释放。总是导致崩溃,找不到任何内存泄漏

java - 通话期间使用设备麦克风

java - JSF 2.0 中不显示 PrimeFaces 饼图