我需要帮助来减少这个该死的代码。我知道这是一个地狱。抱歉我的英语 问题:
任何答案都会有很大帮助。
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);
}
}
答案 0 :(得分:0)
不知道,抱歉
您可以通过几种方式创建单个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的代码。如果您需要更改用户界面,请从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
}