Problema com thread

25 respostas
D

Pessoal eu simplesmente quero que quando abra a tela, me de um Toast

public class Lista extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.lista);
		
		carregaLista();
	}

	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		carregaLista();
	}
	private void carregaLista(){
		new Thread(){
			public void run(){
				Toast.makeText(Lista.this, "to vivo", Toast.LENGTH_LONG).show();
			}
		}.start();
	}
}

mas quando eu clico no botao para ir pra tela de Listar fecha automaticamente

25 Respostas

V

Você precisa colocar esse Toast em um Handler, aqui no GUJ tem um tópico falando sobre isso, porém não encontrei.

D

tentei com isso

final Handler mHandler = new Handler();
final Runnable mUpdateResults = new Runnable() {
    public void run() {
        Toast(this, message, duration).show();
    }

new Thread() {
    public void run() {
        mHandler.post(mUpdateResults);
    }
}.start();

mas parece que nao existe a classe Handler…
[nao tinha visto o comentario antes de postar]

D

eu estava tentando colocar o codigo dentro do onCreate() dai nao estava funcionando misteriosamente. Porém olhe como ficou

public class Lista extends Activity {
	private List<Produto> lista;
	final Handler mHandler = new Handler();
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.lista);
		
		carregaLista();// como eu posso chamar o tal mUpdateResults?
	}
	
	final Runnable mUpdateResults = new Runnable() {
	    public void run() {
	        Toast(this, "Mensagem", Toast.LENGTH_LONG).show();
	    }//parece que falta algo aqui. mas nao é start();

	new Thread() {
	    public void run() {
	        mHandler.post(mUpdateResults);
	    }
	}.start();
	}
	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		carregaLista();
	}
	private void carregaLista(){
		new Thread(){
			public void run(){
				Toast.makeText(Lista.this, "to vivo", Toast.LENGTH_LONG).show();
			}
		}.start();
	}
}
V

Tenta assim:

final Handler mHandler = new Handler() {
	@Override
	public void handleMessage(Message msg) {
		Toast(SuaActivity.this, message, duration).show();
	}
};

 
new Thread() {  
    public void run() {  
        mHandler.sendMessage(new Message());   
    }  
}.start();
D

rs que bizarro, estou com problemas com abrir e fechar chaves, ele precisa ficar aonde? posta o codigo inteiro, eu coloco fora do onCreate começa a funcionar mas tem que fechar chave e quando eu fecho continua dando o mesmo erro acusando de um “;”

dai eu coloquei o ; volta a falar da chave.

V

Não posso por que o código é da empresa que trabalho rs

D

estou falando do meu código ele ja tem tudo la dentro, o oncreate e tudo mais, só quero um toast mas esse handler ta embaçado kkk

V

lembrando que o handler tem que ser declarado no inicio da activity:

[code]
Public class MinhaActivity extends Activity {
private Handler handler;

...

}

D

olha como ficou

public class Lista extends Activity {
	
	private List<Produto> lista;
	final Handler mHandler = new Handler();  
	final Runnable mUpdateResults = new Runnable() {  
	    public void run() {  
	        Toast(this, message, duration).show();  
	    
	  
	new Thread() {  
	    public void run() {  
	        mHandler.post(mUpdateResults);  
	    }  
	}.start();
	}

	
	String url = "www.enginesystem.com.br/android/";
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.lista);
		carregaLista();
	}
	
	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		carregaLista();
	}
	private void carregaLista(){
		new Thread(){
			public void run(){
				Toast.makeText(Lista.this, "to vivo", Toast.LENGTH_LONG).show();
			}
		}.start();
	}
	private void carregaLista2() {
		// TODO Auto-generated method stub
		ListView listaDeProdutos = (ListView) findViewById(R.id.listaDeProdutos);
		ProdutoDAO dao = new ProdutoDAO(Lista.this);
		lista = dao.getLista();
		ArrayAdapter<Produto> adapter = new ArrayAdapter<Produto>(this,
				android.R.layout.simple_list_item_1, lista);
		listaDeProdutos.setAdapter(adapter);
	}
}
V

Posta seu código.

D

postei no comentario acima

V
public class Lista extends Activity {  
      
    private List<Produto> lista;  
    final Handler mHandler = new Handler();    
  
      
    String url = "www.enginesystem.com.br/android/";  
      
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        // TODO Auto-generated method stub  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.lista);  
        mHandler = new Handler() {  
        @Override  
          public void handleMessage(Message msg) {  
            Toast.makeText(Lista.this, "to vivo", Toast.LENGTH_LONG).show();  
          }  
        };  
        carregaLista();  
    }  
      
    @Override  
    protected void onResume() {  
        // TODO Auto-generated method stub  
        super.onResume();  
        carregaLista();  
    }  
    private void carregaLista(){  
        new Thread(){  
            public void run(){
                mHandler.sendMessage(new Message());    
                
            }  
        }.start();  
    }  
    private void carregaLista2() {  
        // TODO Auto-generated method stub  
        ListView listaDeProdutos = (ListView) findViewById(R.id.listaDeProdutos);  
        ProdutoDAO dao = new ProdutoDAO(Lista.this);  
        lista = dao.getLista();  
        ArrayAdapter<Produto> adapter = new ArrayAdapter<Produto>(this,  
                android.R.layout.simple_list_item_1, lista);  
        listaDeProdutos.setAdapter(adapter);  
    }  
}
D

ok, agora eu tentei usar thread para resolver um pequeno problema que eu tinha, que quando eu ia buscar um JSON no site www.enginesystem.com.br/android/

a tela fechava.

o codigo ficou assim

private void carregaLista() {
		new Thread() {
			public void run() {
				ListView listaDeProdutos = (ListView) findViewById(R.id.listaDeProdutos);
				String json = new WebClient("www.enginesystem.com.br/android/")
						.get();
				lista = new ProdutoConverter().listFromJson(json);
				ArrayAdapter<Produto> adapter = new ArrayAdapter<Produto>(
						Lista.this, android.R.layout.simple_list_item_1, lista);
				listaDeProdutos.setAdapter(adapter);
			}
		}.start();
	}

essa é a converter

public class ProdutoConverter {
	public List<Produto> listFromJson(String jsonDosProdutos) {
		GsonBuilder builder = new GsonBuilder();
		Gson gson = builder.create();

		Type listType = new TypeToken<List<Produto>>() {
		}.getType();
		List<Produto> produtos = gson.fromJson(jsonDosProdutos, listType);
		return produtos;
	}
}

E a classe WebClient

public class WebClient {
	private final String url;

	public WebClient(String url) {
		this.url = url;
	}
	public String get() {
		try {
			DefaultHttpClient httpClient = new DefaultHttpClient();  
            HttpGet get = new HttpGet(url);  
            get.setHeader("Accept", "application/json");  
            get.setHeader("Content-type", "application/json");  
            HttpResponse response = httpClient.execute(get);  
            String jsonDeResposta = EntityUtils.toString(response.getEntity());
            return jsonDeResposta;
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
}
V

Rapaz, acho que agora o problema é no retorno do JSON, e não com a thread em si, o Webservice foi feito com que ? Java ?

D

php. mas parece que funciona sim, pois nao mudei nada de quando “funcionava”

D

codigo

<?php 
header('Content-type: application/json') 
?>
<?php
    include "mysqlconecta.php";
// Conecta ao banco de dados
    include "mysqlexecuta.php";
// Executa a cláusula SQL

    //Executa a consulta
    $sql = "SELECT * FROM tabela";
    $res = mysqlexecuta($id,$sql);
?>
<?
   //Exibe as linhas encontradas na consulta
   while ($row = mysql_fetch_array($res,MYSQL_ASSOC)) {
	$total[] = $row;
 }
 echo json_encode($total);
?>
V

e por que deixou de funcionar ? rs

D

meu simplesmente nao sei…
ja estava funcionando esse negocio, eu achei que do jeito simples da thread funcionaria… pois estava funcionando.

V

Mas para que você precisa da thread ? Acho que dá pra fazer sem ela.

D

agora ficou assim
metodo de carregar a lista

private void carregaLista() {

				ListView listaDeProdutos = (ListView) findViewById(R.id.listaDeProdutos);
				String json = new WebClient("www.enginesystem.com.br/android/")
						.get();
				lista = new ProdutoConverter().listFromJson(json);
				ArrayAdapter<Produto> adapter = new ArrayAdapter<Produto>(
						Lista.this, android.R.layout.simple_list_item_1, lista);
				listaDeProdutos.setAdapter(adapter);

	}

Log

11-09 11:37:15.652: E/AndroidRuntime(24827): FATAL EXCEPTION: main
11-09 11:37:15.652: E/AndroidRuntime(24827): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.pdv/com.example.pdv.Lista}: java.lang.RuntimeException: java.lang.IllegalStateException: Target host must not be null, or set in parameters. scheme=null, host=null, path=www.enginesystem.com.br/android/
11-09 11:37:15.652: E/AndroidRuntime(24827): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1970)
11-09 11:37:15.652: E/AndroidRuntime(24827): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1995)
11-09 11:37:15.652: E/AndroidRuntime(24827): 	at android.app.ActivityThread.access$600(ActivityThread.java:128)
11-09 11:37:15.652: E/AndroidRuntime(24827): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1161)
11-09 11:37:15.652: E/AndroidRuntime(24827): 	at android.os.Handler.dispatchMessage(Handler.java:99)
11-09 11:37:15.652: E/AndroidRuntime(24827): 	at android.os.Looper.loop(Looper.java:137)
11-09 11:37:15.652: E/AndroidRuntime(24827): 	at android.app.ActivityThread.main(ActivityThread.java:4514)
11-09 11:37:15.652: E/AndroidRuntime(24827): 	at java.lang.reflect.Method.invokeNative(Native Method)
11-09 11:37:15.652: E/AndroidRuntime(24827): 	at java.lang.reflect.Method.invoke(Method.java:511)
11-09 11:37:15.652: E/AndroidRuntime(24827): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
11-09 11:37:15.652: E/AndroidRuntime(24827): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
11-09 11:37:15.652: E/AndroidRuntime(24827): 	at dalvik.system.NativeStart.main(Native Method)
11-09 11:37:15.652: E/AndroidRuntime(24827): Caused by: java.lang.RuntimeException: java.lang.IllegalStateException: Target host must not be null, or set in parameters. scheme=null, host=null, path=www.enginesystem.com.br/android/
11-09 11:37:15.652: E/AndroidRuntime(24827): 	at com.example.pdv.WebClient.get(WebClient.java:24)
11-09 11:37:15.652: E/AndroidRuntime(24827): 	at com.example.pdv.Lista.carregaLista(Lista.java:38)
11-09 11:37:15.652: E/AndroidRuntime(24827): 	at com.example.pdv.Lista.onCreate(Lista.java:24)
11-09 11:37:15.652: E/AndroidRuntime(24827): 	at android.app.Activity.performCreate(Activity.java:4465)
11-09 11:37:15.652: E/AndroidRuntime(24827): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1053)
11-09 11:37:15.652: E/AndroidRuntime(24827): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1934)
11-09 11:37:15.652: E/AndroidRuntime(24827): 	... 11 more
11-09 11:37:15.652: E/AndroidRuntime(24827): Caused by: java.lang.IllegalStateException: Target host must not be null, or set in parameters. scheme=null, host=null, path=www.enginesystem.com.br/android/
11-09 11:37:15.652: E/AndroidRuntime(24827): 	at org.apache.http.impl.client.DefaultRequestDirector.determineRoute(DefaultRequestDirector.java:591)
11-09 11:37:15.652: E/AndroidRuntime(24827): 	at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:293)
11-09 11:37:15.652: E/AndroidRuntime(24827): 	at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
11-09 11:37:15.652: E/AndroidRuntime(24827): 	at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
11-09 11:37:15.652: E/AndroidRuntime(24827): 	at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
11-09 11:37:15.652: E/AndroidRuntime(24827): 	at com.example.pdv.WebClient.get(WebClient.java:20)
V

O erro aí é da webservice, tem algo errado rs.

D

a resposta que vem é essa
[{“id”:“2”,“produto”:“produto 2”,“codigo”:“5412”,“preco”:“20”,“foto”:null},{“id”:“1”,“produto”:“Produto 1”,“codigo”:“5520”,“preco”:“25.5”,“foto”:null}]

V

Ele está falando sobre um erro que retorna null, será que não é por que a foto ta vindo não ? Coloque as fotos nestes produtos e testa novamente.

D

agora ja retorna [{“id”:“2”,“produto”:“produto 2”,“codigo”:“5412”,“preco”:“20”,“foto”:“teste”},{“id”:“1”,“produto”:“Produto 1”,“codigo”:“5520”,“preco”:“25.5”,“foto”:“teste”}]

D

mew ja nao sei mais oque fazer kkk

Criado 9 de novembro de 2012
Ultima resposta 9 de nov. de 2012
Respostas 25
Participantes 2