2011-03-07 9 views
5

chcę wyświetlić komunikat tosty wewnątrz zegara i używałem następujący kod:Jak wyświetlić tosty w czasomierzu?

timer.scheduleAtFixedRate(new TimerTask() 
{  
public void run() 
{ 
    try { 
     fun1(); 
     } catch (Exception e) {e.printStackTrace(); }    
    } 
}, 0,60000);  

public void fun1() 
{ 
    //want to display toast 
} 

i otrzymuję następujący błąd:

WARN/System.err (593): java.lang.RuntimeException: nie można utworzyć obsługi wewnątrz wątku, który nie powołał Looper.prepare()

WARN/System.err (593). w android.os.Handler (Handler.java:121)

WARN/systemu .err (593): w Android.widget.Toast. (Toast.java:68)

WARN/System.err (593): w android.widget.Toast.makeText (Toast.java:231)

Dzięki.

+0

Połączyłem wszystkie te informacje w pełni działającym kodzie, zobacz ten http://stackoverflow.com/questions/11906361/how-to-display-a-toast-in-a-timer – Sourav301

Odpowiedz

5

Nie można dokonać aktualizacji UI wewnątrz osobnym wątku, jak Timer. Do aktualizacji interfejsu użytkownika należy użyć obiektu Handler:

timer.scheduleAtFixedRate(new TimerTask() { 
private Handler updateUI = new Handler(){ 
@Override 
public void dispatchMessage(Message msg) { 
    super.dispatchMessage(msg); 
    fun1(); 
} 
}; 
public void run() { 
try { 
updateUI.sendEmptyMessage(0); 
} catch (Exception e) {e.printStackTrace(); } 
} 
}, 0,60000); 
+0

Dzięki .. pomógł mi .. :) – Monali

0

tworzyć toast Handler i wyświetlania w tym

private Handler handler = new Handler() { 
     public void handleMessage(android.os.Message msg) { 
      // Toast here 
     } 
    }; 
+0

nadal otrzymuję ten sam błąd – Monali

0

potrzebny jest dostęp do kontekstu aplikacji, aby móc to zrobić. Spróbuj utworzyć własną klasę która przyjmuje jako parametr wejściowy kontekst:

private class MyTimerTask extends TimerTask { 
    private Context context; 
    public MyTimerTask(Context context) { 
     this.context = context; 
    } 

    @Override 
    public void run() { 
     Toast.makeText(context, "Toast text", Toast.LENGTH_SHORT).show(); 
    } 

} 

Następnie w czasomierz:

timer.scheduleAtFixedRate(new MyTimerTask(this), 0,60000); 
+0

To nie działa dla mnie! Nadal dał ten sam błąd: java.lang.RuntimeException: Nie można utworzyć obsługi wewnątrz wątku, który nie nazwał Looper.prepare() – robguinness

0

Staram się tworzyć własne tosty z własnymi poglądami.

Po udanym połączeniu Twoich podejść. Poniższy kod pozwala mi pokazywać toasty i zmieniać/usuwać widoki bez awarii, po prostu zmieniaj parametry konstruktora MyTimerTask na wszystko, czego potrzebujesz do pracy.

public void yourFunction(){ 

    Timer timer = new Timer(); 
    MyTimerTask mtc = new MyTimerTask(this.getContext(), tvNotice); 
    timer.schedule(mtc, 1000); 
} 

private class MyTimerTask extends TimerTask { 

    private TextView tv; 
    private Context context; 
    public MyTimerTask(Context pContext, TextView pTv) { 
     this.tv = pTv; 
     this.context = pContext; 
    } 
    @Override 
    public void run() { 
     updateUI.sendEmptyMessage(0); 
    } 

    private Handler updateUI = new Handler(){ 
     @Override 
     public void dispatchMessage(Message msg) { 
      super.dispatchMessage(msg); 


      tv.setText("TextView Message"); 
      Toast.makeText(context, "Toast Message", 0).show(); 
     } 
    }; 
} 
0

Chciałem zrobić prosty projekt, który mógłby wyświetlić toast w zegarku. Timer zostanie uruchomiony przy użyciu usługi. Następnie Timer rozpoczyna się po uruchomieniu usługi i zatrzymuje się po zatrzymaniu usługi.

Klasa 1

package com.example.connect; 


import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.os.Handler; 
import android.view.View; 
import android.widget.Button; 

public class MainActivity extends Activity { 

Button button1,button2; 
private Handler mHandler = new Handler(); 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    button1=(Button)findViewById(R.id.button1); 
    button2=(Button)findViewById(R.id.button2); 


} 


public void Start(View v) 
{ 
    startService(new Intent(MainActivity.this , Connect_service.class)); 

} 

public void Stop(View v) 
{ 
    stopService(new Intent(MainActivity.this , Connect_service.class)); 

} 

} 

klasy 2

package com.example.connect; 

import java.util.Timer; 
import java.util.TimerTask; 

import android.app.Service; 
import android.content.Intent; 
import android.os.IBinder; 
import android.widget.Toast; 

public class Connect_service extends Service{ 

Timer timer = new Timer(); 
TimerTask updateProfile = new CustomTimerTask(Connect_service.this); 

public void onCreate() { 

    super.onCreate(); 

    Toast.makeText(this, "Service Started", Toast.LENGTH_SHORT).show(); 
    timer.scheduleAtFixedRate(updateProfile, 0, 5000); 

} 


@Override 
public void onDestroy() { 
    // TODO Auto-generated method stub 
    super.onDestroy(); 
    Toast.makeText(this, "Service Stopped", Toast.LENGTH_SHORT).show(); 
    timer.cancel(); 
} 



@Override 
public IBinder onBind(Intent intent) { 
    // TODO Auto-generated method stub 
    return null; 
} 

} 

klasy 3

package com.example.connect; 

import java.util.TimerTask; 

import android.content.Context; 
import android.os.Handler; 
import android.widget.Toast; 
public class CustomTimerTask extends TimerTask { 


private Context context; 
private Handler mHandler = new Handler(); 

public CustomTimerTask(Context con) { 
    this.context = con; 
} 



@Override 
public void run() { 
    new Thread(new Runnable() { 

     public void run() { 

      mHandler.post(new Runnable() { 
       public void run() { 
        Toast.makeText(context, "In Timer", Toast.LENGTH_SHORT).show(); 

       } 
      }); 
     } 
    }).start(); 

} 

} 
2

Najłatwiej (MOM) stanowi:

new Timer().scheduleAtFixedRate(new TimerTask() { 
    @Override 
    public void run() { 
     final String message = "Hi"; 
     MyActivity.this.runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       Toast.makeText(MyActivity.this, message, Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 
}); 

Kluczem jest MyActivity.this.runOnUiThread (Runnable).