【问题标题】:Reducing a huge code on many activityes减少许多活动的大量代码
【发布时间】:2012-01-03 21:18:14
【问题描述】:

我需要帮助来减少这个该死的代码。我知道这是一个地狱。对不起我的英语 问题:

  1. 我读过关于 parcelable 的文章,不知道如何使用 strong(因为我的对象中有一个数组列表)
  2. 我可以创建一个通用类型的 onclicklisteners(在这种情况下)
  3. 我尝试了 assynctask,但主 ui 被阻止并且我得到一个黑屏 最后 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);

 } 

}

【问题讨论】:

    标签: android format reduce


    【解决方案1】:
    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);
      

    或者您可以使用自动生成的视图 ID:

        @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,尽管它有很多问题。在 AsyncTask 中覆盖 onPublishProgress,并将任何更改 UI 的代码放入其中。当您需要更改 UI 时,请从 doInBackground 内部调用 publishProgress

    4 当您更改方向时,android 基本上会重新启动活动(再次调用onCreate)。这可能是导致您出现线程问题的原因。将 android:configChanges="orientation" 放入您的 android 清单文件中的活动标记内。这将允许您通过覆盖 Activity 中的 onConfigurationChanged 方法来拦截方向更改。然后,您将设置所有 onClickListeners、设置所有视图等的代码放在onCreate 中,这样它只会在用户第一次启动 Activity 时被调用一次。然后如果你需要在用户改变方向时做任何特定的事情,你可以在onConfigurationChanged

    我认为一旦你对线程进行排序,它会使其他事情变得容易得多


    编辑:好的,是时候解决线程问题了

    android 中唯一允许更新 UI 的线程是主线程(也称为 UI 线程)。这是在您的活动开始时调用 onCreate() 的线程。

    AsyncTask 用于在 Android 中创建线程并允许这些线程请求 UI 线程更新 UI。所以..

    首先将 AsyncTask 创建为 Activity 的内部类。它必须是公共的,否则 android 无法访问它来运行它。在 AsyncTask 的doInBackground() 中,放置 SAXParser。当解析器完成解析时,调用publishProgress()。这将导致 onProgressUpdate() 在其下一次传递中被 UI 线程调用

    onProgressUpdate() 中,拨打电话至telaPrincipal()。这意味着 telaPrincipal() 将在解析完成时被 UI 线程调用

    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
    
    }
    

    【讨论】:

    • 哇,这对人很有帮助!好吧,我认为剩下的唯一问题是将我的对象传递给其他活动(所以是的 parcelable 或 Gson 必须这样做......接受建议)并减少活动代码更多。
    • 1- 仍然没有想法 2- 已解决:感谢 Spoon Thumb 3- 使用 asynctask 作为内部类?需要帮助 4- 将取决于 3
    • 更新了我关于线程和 AsyncTask 的答案。我的理解是,您想让一个线程忙于读取 rss 提要,然后在 SAX 解析器完成对提要的解析时更新应用程序
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    • 2020-06-12
    • 2020-02-19
    • 2021-08-29
    • 1970-01-01
    相关资源
    最近更新 更多