2016-01-10 3 views
0

Мне нужно создать приложение для Android для моего проекта в прошлом году (я новичок в разработке Android). Есть ли идея свести к минимуму код или, возможно, разделить его на разные классы.как сделать мой код (AsyncTask) чище?

Я хочу сделать свой основной вид более коротким и чистым для обслуживания, и желательно, если он может быть закодирован с использованием архитектуры MVC. В дальнейшем будет добавлено больше компонентов интерфейса. Спасибо за внимание ура.

public class MainActivity extends AppCompatActivity { 
    Button find_button; 
    EditText user_origin; 
    EditText user_destination; 
    private TextView json_output; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     find_button = (Button)findViewById(R.id.find_button); 
     json_output = (TextView)findViewById(R.id.json_output); 
     user_origin = (EditText)findViewById(R.id.user_origin); 
     user_destination = (EditText)findViewById(R.id.user_destination); 

     find_button.setOnClickListener(new View.OnClickListener(){ 
      String origin; 
      String new_origin; 
      String destination; 
      String new_user_destination; 

      @Override 
      public void onClick(View v){ 
       origin = user_origin.getText().toString(); 
       new_origin = origin.replaceAll(" ", "+"); 
       destination = user_destination.getText().toString(); 
       new_user_destination = destination.replaceAll(" ", "+"); 

       String link = "https://maps.googleapis.com/maps/api/directions/json?origin=" + new_origin + "&destination=" + new_user_destination + "&mode=transit&key=AIzaSyD83XCiGtJyo6Ln8c7yyyrQwmFDFZB_oiU"; 

       //json_output.setText(link); 
       new JSONTask().execute(link); 
      } 
     }); 



    } 

    public class JSONTask extends AsyncTask<String,String,String> { 

     @Override 
     protected String doInBackground(String... params){ 
      HttpURLConnection connection = null; 
      BufferedReader reader = null; 

      try{ 
       URL url = new URL(params[0]); 
       connection = (HttpURLConnection) url.openConnection(); 
       connection.connect(); 

       InputStream stream = connection.getInputStream(); 

       reader = new BufferedReader(new InputStreamReader(stream)); 

       StringBuffer buffer = new StringBuffer(); 

       String line = ""; 
       while((line = reader.readLine()) != null){ 
        buffer.append(line); 
       } 

       String final_json = buffer.toString(); 

       return buffer.toString(); 

      } catch (MalformedURLException e){ 
       e.printStackTrace(); 
      } catch (IOException e){ 
       e.printStackTrace(); 
      } finally { 
       if(connection != null) { 
        connection.disconnect(); 
       } 
       try { 
        if(reader != null) { 
         reader.close(); 
        } 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(String result){ 
      super.onPostExecute(result); 
      json_output.setText("result:" +result); 
     } 
    } 
} 

ответ

0

Вы можете отделить JSONTask как простой класс, и выполнить свою задачу, а затем определить интерфейс в этом классе, чтобы передать какое-то сообщение или данные должны быть обработаны другим классом, а также добавить параметр типа этот интерфейс для конструктора и сохранить его как field.like это:

public class JSONTask extends AsyncTask<String,String,String>{ 
    private OnHandleResult mResult; 
    private String[] mParams; 
    public JSONTask(OnHandleResult onHandleResult,String... params){ 
     this.mResult = onHandleResult; 
     this.mParams = params; 
    } 

    protected String doInBackground(String... params){ 
    //params is empty,get params from this.mParams 
    } 

    @Override 
    protected void onPostExecute(String result){ 
     super.onPostExecute(result); 
     //json_output.setText("result:" +result); 
     this.mResult.handleResult(result); 
    } 

    public static interface OnHandleResult{ 
     void handleResult(final String result); 
    } 
} 

то пусть ваша деятельность реализует интерфейс onHandleResult и hanlde результат: набор текста TextView:

public class MainActivity extends AppCompatActivity implements JSONTask.OnHandleResult{ 
    void handleResult(final String result){ 
     json_output.setText("result:" +result); 
    } 
} 

и выполнить задачу так:

new JSONTask(this,link).execute(); 
+0

может я также сделать еще один класс только для компонентов пользовательского интерфейса? –

+0

вы можете изменить параметр конструктора из 'OnHandleResult' в' Activity', тогда только подкласс Activity может обрабатывать данные, но вы должны гарантировать, что ваша деятельность реализует этот интерфейс. – starkshang

0

Обычно это хорошая практика, чтобы иметь 1 класс каждого файла. Вы можете сделать MainActivity немного более читаемым

public class MainActivity extends AppCompatActivity { 

Button find_button; 
EditText user_origin; 
EditText user_destination; 
private TextView json_output; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    find_button = (Button) findViewById(R.id.find_button); 
    json_output = (TextView) findViewById(R.id.json_output); 
    user_origin = (EditText) findViewById(R.id.user_origin); 
    user_destination = (EditText) findViewById(R.id.user_destination); 

    String link = build_link(user_origin, user_destination); 

    MyListener l = new MyListener(link); 
    find_button.setOnClickListener(l); 
} 

private String build_link(EditText user_origin, EditText user_destination) { 

    String origin = user_origin.getText().toString(); 
    String new_origin = origin.replaceAll(" ", "+"); 
    String destination = user_destination.getText().toString(); 
    String new_user_destination = destination.replaceAll(" ", "+"); 

    return "https://maps.googleapis.com/maps/api/directions/json?origin=" + new_origin + "&destination=" + new_user_destination + "&mode=transit&key=AIzaSyD83XCiGtJyo6Ln8c7yyyrQwmFDFZB_oiU"; 
} 

изолируя реализации вашего слушателя:

public class MyListener implements View.OnClickListener { 

String link; 

public MyListener(String link) { 

    this.link = link; 
} 

@Override 
public void onClick(View v) { 

    new JSONTask().execute(link); 
} 
Смежные вопросы