Сокращение огромного кода на многих видах деятельности - PullRequest
2 голосов
/ 22 ноября 2011

Мне нужна помощь, чтобы уменьшить этот проклятый код. Я знаю, что это ад. Извините за мой английский Проблемы:

  1. Я читал о parcelable, понятия не имею, как использовать жесткий (потому что у меня есть arraylist внутри моего объекта)
  2. Могу ли я создать универсальный тип onclicklisteners (в данном случае)
  3. Я пробовал assynctask, но основной интерфейс заблокирован, и я получаю черный экран и 4 последние изменения ориентации 3 раза приводят к исключению в моем диалоге

Любой ответ очень поможет.

public class AndroidfeedtsxActivity extends Activity implements ViewFactory {
 private int evento = 0;
 private boolean isfavorite = false;
 private Handler handler = new Handler();
 private ProgressDialog dialog;
 private List<Noticia> exists;

 /** first method called */
 @Override
 public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.main);

     noticias();
 }

 /*/
  * --------------------------------------------------------------------
  */

 /*
  * /starts the main screen, and the imagebuttons
  */
 private void telaPrincipal(final List<Noticia> naoFormatada) {
               //close progress dialog
     dialog.dismiss();
     handler.post(new Runnable() {

         @Override
         public void run() {

             //Formating my xml
             final List<Noticia> lista = new Formatador()
             .Formatar(naoFormatada);




             if (!(lista.isEmpty() || lista== null)) {
                 exists = naoFormatada;
                 setContentView(R.layout.main);

                 evento++;

                 ImageButton ImgBtnEsportes = (ImageButton) findViewById(R.id.ImgBtnEsportes);
                 ImgBtnEsportes.setClickable(true);

                 ImageButton ImgBtnTodas = (ImageButton) findViewById(R.id.ImgBtnTodas);
                 ImgBtnTodas.setClickable(true);

                 ImageButton ImgBtnComunidade = (ImageButton) findViewById(R.id.ImgBtnComunidade);
                 ImgBtnComunidade.setClickable(true);

                 ImageButton ImgBtnPolicia = (ImageButton) findViewById(R.id.ImgBtnPolicia);
                 ImgBtnPolicia.setClickable(true);

                 ImageButton ImgBtnFavoritos = (ImageButton) findViewById(R.id.ImgBtnFavoritos);

                 // show all news
                 ImgBtnTodas.setOnClickListener(new OnClickListener() {
                     @Override
                     public void onClick(View arg0) {
                         isfavorite = false;
                         telaMensagens(lista);

                     }
                 });

                 // show sport news only
                 ImgBtnEsportes.setOnClickListener(new OnClickListener() {
                     @Override
                     public void onClick(View arg0) {
                         isfavorite = false;
                         telaMensagens(Categorizador(lista, "Esportes"));
                     }
                 });

                 // show police news only
                 ImgBtnPolicia.setOnClickListener(new OnClickListener() {
                     @Override
                     public void onClick(View arg0) {
                         isfavorite = false;
                         telaMensagens(Categorizador(lista, "Polícia"));
                     }
                 });

                 // shows comunity news only
                 ImgBtnComunidade.setOnClickListener(new OnClickListener() {
                     @Override
                     public void onClick(View arg0) {
                         isfavorite = false;
                         telaMensagens(Categorizador(lista, "Comunidade"));
                     }
                 });

                 // show the favorited news
                 ImgBtnFavoritos.setOnClickListener(new OnClickListener() {
                     @Override
                     public void onClick(View arg0) {
                         NoticiaDAO banco = new NoticiaDAO(getBaseContext());
                         try {
                             List<Noticia> noticias = banco.getLista();
                             banco.close();
                             isfavorite = true;

                             telaMensagens(noticias);
                         } catch (ParseException e) {
                             Log.e("Erro ao tentar abrir Favoritos", " " + e);
                         }
                     }
                 });
             } else {
                 Toast t;
                 t = Toast
                         .makeText(
                                 getBaseContext(),
                                 "Não foi possível obter as noticias no momento...\nTente novamente mais tarde.",
                                 Toast.LENGTH_LONG);
                 t.show();
                 setContentView(R.layout.main);
                 evento++;
                 ImageButton ImgBtnEsportes = (ImageButton) findViewById(R.id.ImgBtnEsportes);
                 ImgBtnEsportes.setClickable(false);
                 ImageButton ImgBtnTodas = (ImageButton) findViewById(R.id.ImgBtnTodas);
                 ImgBtnTodas.setClickable(false);
                 ImageButton ImgBtnComunidade = (ImageButton) findViewById(R.id.ImgBtnComunidade);
                 ImgBtnComunidade.setClickable(false);
                 ImageButton ImgBtnPolicia = (ImageButton) findViewById(R.id.ImgBtnPolicia);
                 ImageButton ImgBtnFavoritos = (ImageButton) findViewById(R.id.ImgBtnFavoritos);
                 ImgBtnPolicia.setClickable(false);
                 ImgBtnFavoritos.setOnClickListener(new OnClickListener() {
                     @Override
                     public void onClick(View arg0) {
                         NoticiaDAO banco = new NoticiaDAO(getBaseContext());
                         try {
                             List<Noticia> noticias = banco.getLista();
                             banco.close();
                             isfavorite = true;

                             telaMensagens(noticias);
                         } catch (ParseException e) {
                             Log.e("Erro ao tentar abrir Favoritos", " " + e);
                         }

                     }
                 });

             }

         }
     });
 }

/ * / * ------------------------------------------------- ---------------------------- * /

 /*
  * / call the screen with the news as a list
  */
 public void telaMensagens(final List<Noticia> noticias) {

     evento--;
     // controll the number of times the backbutton is pressed

     /*
      * / call the xml screen for the list
      */
     setContentView(R.layout.lista);

     /*
      * / declarando um listview em java que chama o listview do xml
      */
     ListView lista = (ListView) findViewById(R.id.listView1);
     if (!noticias.isEmpty()) {
         // declarando arrayadapter que adapta uma arraylist em uma lista
         /*
          * / android dependendo do método tostring()
          */
         ArrayAdapter<Noticia> adapter = new ArrayAdapter<Noticia>(this,
                 R.layout.listadjust, noticias);

         /*
          * / setando o adapter
          */
         lista.setAdapter(adapter);

         /*
          * / permitindo que a lista seja clicável
          */
         lista.setClickable(true);

         /*
          * / qual ação a lista tomará ao clicar em um item
          */
         lista.setOnItemClickListener(new OnItemClickListener() {
             @Override
             public void onItemClick(AdapterView<?> arg0, View arg1,
                     int arg2, long arg3) {
                 telaLeitura(arg2, noticias);
             }
         });
     } else {
         Toast t;
         t = Toast.makeText(getBaseContext(),
                 "Não há noticias para essa categoria no momento...",
                 Toast.LENGTH_SHORT);
         t.show();

     }
 }

 /*/
  * --------------------------------------------------------------------------------
  */

 /*
  * / call the news reader screen and stantiate the imagebuttons to see images and */add to favorites
  */
 public void telaLeitura(int posicao, List<Noticia> noticias) {
     setContentView(R.layout.telaleitura);
     TextView texto = (TextView) findViewById(R.id.textView1);
     final Noticia atual = noticias.get(posicao);
     texto.setText(atual.getContent());
     texto.setClickable(true);
     final ImageButton getImageButton = (ImageButton) findViewById(R.id.imageButton1);
     ImageButton favoritos = (ImageButton) findViewById(R.id.imageButton2);
     ImageButton Excluir = (ImageButton) findViewById(R.id.imageButton3);
     if (!isfavorite) {
         favoritos.setVisibility(0);
     } else {

         Excluir.setVisibility(0);
     }
     /*
      * / controll delete button
      */
     Excluir.setOnClickListener(new OnClickListener() {

         @Override
         public void onClick(View v) {
             AlertDialog.Builder builder = new AlertDialog.Builder(AndroidfeedtsxActivity.this);
             builder.setMessage("Deseja excluir esse favorito?")
                    .setCancelable(false)
                    .setPositiveButton("Sim", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                             NoticiaDAO banco = new NoticiaDAO(getBaseContext());
                             banco.excluir(atual.getId());
                             banco.close();
                             Toast t;
                             t = Toast.makeText(getBaseContext(),
                                     "Favorito Excluido com sucesso.", Toast.LENGTH_SHORT);
                             t.show();
                             noticias();
                        }
                    })
                    .setNegativeButton("Não", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                             dialog.cancel();

                        }
                    });
             AlertDialog alert = builder.create();
             alert.show();

         }
     });

     /*
      * / controlling favorites insertion
      */
     favoritos.setOnClickListener(new OnClickListener() {
         @Override
         public void onClick(View arg0) {
             final NoticiaDAO banco = new NoticiaDAO(getBaseContext());

             try {
                 List<Noticia> Noticias = banco.getLista();
                 if (!Noticias.contains(atual)) {
                     //Cria alerta dialogo confirmando...
                     AlertDialog.Builder builder = new AlertDialog.Builder(AndroidfeedtsxActivity.this);
                     builder.setMessage("Deseja adicionar noticia aos favoritos?")
                            .setCancelable(false)
                            .setPositiveButton("Sim", new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int id) {
                                     banco.inserir(atual);
                                     Toast t;
                                     t = Toast
                                             .makeText(getBaseContext(),
                                                     "Adicionada aos favoritos!",
                                                     Toast.LENGTH_SHORT);
                                     t.show();
                                     banco.close();
                                }
                            })
                            .setNegativeButton("Não", new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int id) {
                                     dialog.cancel();
                                     banco.close();
                                }
                            });
                     AlertDialog alert = builder.create();
                     alert.show();

                 } else {
                     Toast t;
                     t = Toast.makeText(getBaseContext(),
                             "Notícia já está nos favoritos.",
                             Toast.LENGTH_SHORT);
                     t.show();
                     banco.close();
                 }
             } catch (ParseException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
             }


         }
     });

     /*
      * /if the news have images
      */
     if (atual.getImages().size() > 0) {
         getImageButton.setVisibility(0);

         // oque o botão fará quando clicado
         getImageButton.setOnClickListener(new OnClickListener() {

             @Override
             public void onClick(View v) {
                 if (atual.getImages().size() > 0) {
                     // cria a intenção de chamar galeria, e inicia a
                     // activity galeria
                     Intent it = new Intent(getBaseContext(),
                             GalleryTSX.class);
                     it.putStringArrayListExtra("Lista",
                             (ArrayList<String>) atual.getImages());
                     setIntent(it);
                     startActivity(it);
                 }
             }
         });
     }
 }

 /*
  * / controll backbutton when pressed twice(non-Javadoc)
  * @see android.app.Activity#onKeyDown(int, android.view.KeyEvent)
  */
 @Override
 public boolean onKeyDown(int keyCode, KeyEvent event) {
     if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {

         if (evento < 2 && evento > 0) {
             Toast t;
             // Toast é um alerta do sistema
             t = Toast.makeText(this, "Pressione mais uma vez para sair",
                     Toast.LENGTH_SHORT);
             t.show();
         }
         if (evento > 1) {
             //Inicia serviço de alerta de Noticias Novas
             startService(new Intent(this, UpdateService.class));
             finish();

         }
         noticias();
         return true;
     }

     return super.onKeyDown(keyCode, event);
 }



 /*
  * / Controll news categorizer
  */
 public List<Noticia> Categorizador(List<Noticia> lista, String categoria) {
     List<Noticia> categorizada = new ArrayList<Noticia>();
     for (Noticia noticias : lista) {
         if (noticias.getCategory().equalsIgnoreCase(categoria)) {
             categorizada.add(noticias);
         }
     }
     return categorizada;
 }

 /*
  * / must be implemented for gallery usage(non-Javadoc)
  * @see android.widget.ViewSwitcher.ViewFactory#makeView()
  */
 @Override
 public View makeView() {
     ImageView iView = new ImageView(this);
     iView.setScaleType(ImageView.ScaleType.FIT_CENTER);
     iView.setLayoutParams(new ImageSwitcher.LayoutParams(
             LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));

     return iView;
 }



 /*/
  * (non-Javadoc)creates the menu
  * @see android.app.Activity#onCreateOptionsMenu(android.view.Menu)
  */
 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
     MenuInflater inflater = getMenuInflater();
     inflater.inflate(R.layout.menu, menu);
     return true;
 }

 /*/
  * (non-Javadoc) create a option in the menu "update"
  * @see android.app.Activity#onOptionsItemSelected(android.view.MenuItem)
  */
 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
     switch (item.getItemId()) {

     case R.id.text:
         this.exists=null;
         noticias();
         break;

     }
     return true;
 }

 // controlls if must be updated or not
 public void noticias() {
     dialog = ProgressDialog.show(this, "Aguarde...",
             "Baixando noticias, por favor aguarde...", false, true);
     if(this.exists==null || this.exists.isEmpty()){
         new Thread() {
             /*/
              * (non-Javadoc) Pegar As noticias do RSS e fazer parse
              * @see java.lang.Thread#run()
              */
             @Override
             public void run() {
                 try {
                     List<Noticia> noticias = new ArrayList<Noticia>();
                     URL url = new URL(
                             "http://www.tudosobrexanxere.com.br/index.php/rss");
                     SAXParserFactory factory = SAXParserFactory.newInstance();
                     NoticiaHandler handler = new NoticiaHandler();
                     SAXParser saxParser= factory.newSAXParser();
                     saxParser.parse(url.openStream(), handler);
                     noticias = handler.getMessages();
                     telaPrincipal(noticias);
                 } catch (ParserConfigurationException e1) {
                     Log.e("Exception no Parser de ParserConfiguration",
                             "Exception" + e1);
                     Toast t;
                     // Toast é um alerta do sistema
                     t = Toast.makeText(AndroidfeedtsxActivity.this, "Problema ao obter notícias\nPor favor, use o menu para atualizar...",
                             Toast.LENGTH_LONG);
                     t.show();
                     if(exists!=null){
                         telaPrincipal(exists);
                     }
                     else{
                         telaPrincipal(new ArrayList<Noticia>());
                     }

                 } catch (SAXException e1) {
                     // TODO Auto-generated catch block
                     Log.e("Exception no Parser de SaxException", "Exception"
                             + e1);
                     Toast t;
                     // Toast é um alerta do sistema
                     t = Toast.makeText(AndroidfeedtsxActivity.this, "Problema ao obter notícias\nPor favor, atualize as noticias...",
                             Toast.LENGTH_LONG);
                     t.show();
                     if(exists!=null){
                         telaPrincipal(exists);
                     }
                     else{
                         telaPrincipal(new ArrayList<Noticia>());
                     }

                 } catch (IOException e) {
                     if(exists!=null){
                         telaPrincipal(exists);
                     }
                     else{
                         telaPrincipal(new ArrayList<Noticia>());
                     }
                     Toast t;
                     // Toast é um alerta do sistema
                     t = Toast.makeText(AndroidfeedtsxActivity.this, "Problema na sua conexão com a Internet\nPor favor, tente novamente mais tarde...",
                             Toast.LENGTH_LONG);
                     t.show();
                     Log.e("Exception no Parser de IO", "Exception" + e);
                 } catch (Exception e) {
                     if(exists!=null){
                         telaPrincipal(exists);
                     }
                     else{
                         telaPrincipal(new ArrayList<Noticia>());
                     }
                     Toast t;
                     // Toast é um alerta do sistema
                     t = Toast.makeText(AndroidfeedtsxActivity.this, "Problema ao obter notícia\nPor favor, atualize as noticias...",
                             Toast.LENGTH_LONG);
                     t.show();
                     Log.e("Exception no Parser", "Exception" + e);
                 }

             }

         }.start();

     }else telaPrincipal(exists);

 } 

}

1 Ответ

0 голосов
/ 22 ноября 2011
  1. Не знаю, извините

  2. Вы можете создать один onClickListener несколькими способами.Главное, чтобы определить, какая кнопка была нажата, чтобы вы могли сделать соответствующее действие.Есть несколько вариантов.Либо вы можете использовать view.setTag () и view.getTag ():

    ImageButton ImgBtnEsportes = (ImageButton) findViewById(R.id.ImgBtnEsportes);
    ImgBtnEsportes.setClickable(true);
    ImgBtnEsportes.setTag("Esportes");
    
    ImageButton ImgBtnTodas = (ImageButton) findViewById(R.id.ImgBtnTodas);
    ImgBtnTodas.setClickable(true);
    ImgBtnEsportes.setTag("Todas");
    
     // etc
    
    OnClickListener buttonClickListener = new OnClickListener(){
    
         @Override
         public void onClick(View arg0) {
    
             String tag = ((String)arg0.getTag());
    
             if(tag.equalsIgnoreCase("Esportes")){
    
                 isfavorite = false;
                 telaMensagens(Categorizador(lista, "Esportes"));
    
             } else if(tag.equalsIgnoreCase("Todas")){
                 isfavorite = false;
                 telaMensagens(Categorizador(lista, "Todas")); 
             }
    
         }
    
    
    };
    
    ImgBtnEsportes.setOnClickListener(buttonClickListener);
    ImgBtnTodas.setOnClickListener(buttonClickListener);
    

, либо вы можете использовать автоматически сгенерированные идентификаторы представления:

    @Override
    public void onClick(View arg0) {

         int viewID = arg0.getId();

         if(viewID == R.id.ImgBtnEsportes){

                         isfavorite = false;
                         telaMensagens(Categorizador(lista, "Esportes"));

         } else if(viewID == R.id.ImgBtnTodas){
             isfavorite = false;
                         telaMensagens(Categorizador(lista, "Todas")); 
         }

    }

3 Я бы порекомендовал использовать AsyncTask, несмотря на все его проблемы.Переопределите onPublishProgress в AsyncTask и поместите туда любой код, который изменяет пользовательский интерфейс.Когда вам нужно изменить пользовательский интерфейс, звоните publishProgress изнутри doInBackground

4 Когда вы меняете ориентацию, android в основном перезапускает действие (снова вызывает onCreate).Это, вероятно, то, что вызывает у вас проблемы с потоками.Поместите android:configChanges="orientation" в файл манифеста Android внутри тега активности.Это позволит вам перехватывать изменения ориентации путем переопределения метода onConfigurationChanged в Activity.Затем вы помещаете код для установки всех onClickListeners, настройки всех представлений и т. Д. В onCreate, чтобы он вызывался только один раз, когда пользователь впервые запускает Activity.Затем, если вам нужно сделать что-то конкретное, когда пользователь меняет ориентацию, вы делаете это в onConfigurationChanged

Я думаю, как только вы отсортируете потоки, это облегчит другие дела


Редактировать: Хорошо, время для решения потоков

Единственный поток, которому разрешено обновлять пользовательский интерфейс в Android, - это основной поток (также называемый потоком пользовательского интерфейса).Это поток, который вызывает onCreate () при запуске вашей деятельности.

AsyncTask используется для создания потоков в Android и позволяет этим потокам запрашивать поток пользовательского интерфейса для обновления пользовательского интерфейса.Итак ..

Сначала создайте свою AsyncTask как внутренний класс вашей деятельности.Он должен быть общедоступным, или Android не может получить к нему доступ для запуска.В doInBackground() AsyncTask установите SAXParser.Когда синтаксический анализатор завершит анализ, вызовите publishProgress().Это заставит onProgressUpdate() быть вызванным потоком пользовательского интерфейса в следующем проходе

В onProgressUpdate() переведите ваш вызов на telaPrincipal().Это будет означать, что telaPrincipal() будет вызван потоком пользовательского интерфейса после завершения анализа

В nocitas(), замените new Thread(){ etc }.start() на new CustomAsyncTask().execute()

В telaPrincipal(), неиспользовать нить на всех.Т.е.

 private void telaPrincipal(final List<Noticia> naoFormatada) {
      //close progress dialog
      dialog.dismiss();


     //Formating my xml
     final List<Noticia> lista = new Formatador()
     .Formatar(naoFormatada);

     if (!(lista.isEmpty() || lista== null)) {
         exists = naoFormatada;
         // etc

}
...