减少许多活动的巨大代码

时间:2011-11-22 13:32:43

标签: android format reduce

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

  1. 我读过关于parcelable,没有ideia如何使用强硬(因为我的对象里面有一个arraylist)
  2. 我可以创建泛型类型的onclicklisteners(在本例中)
  3. 我尝试过assynctask,但主要的ui被阻止,我得到一个黑屏 4最后一次更改方向3次导致我的对话框异常
  4. 任何答案都会有很大帮助。

    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 :(得分:0)

  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);
    
  3. 或者您可以使用自动生成的视图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的代码。如果您需要更改用户界面,请从publishProgress

    内拨打doInBackground

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

    中执行此操作

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


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

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

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

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

    onProgressUpdate()中,将您的电话转至telaPrincipal()。这意味着当解析完成时,UI线程将调用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
    
    }