2011-03-07 4 views
5

내가 타이머 내부 토스트 메시지를 표시 할 나는 다음과 같은 코드를 사용 :타이머 내부의 토스트를 표시하는 방법은 무엇입니까?

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

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

을 그리고 나는 다음과 같은 오류가 점점 오전 :

이 WARN/System.err에 (593) : java.lang.RuntimeException가 : . android.os.Handler에서 (Handler.java:121)

이 WARN/시스템 : Looper.prepare라고하지 스레드 내부 핸들러를 만들 수 없습니다()

은/System.err에 (593) WARN .err (593) : android.widget.Toast에서 (Toast.java:68) android.widget.Toast.makeText (Toast.java:231)에서

감사 :

은/System.err에 (593) WARN.

+0

나는이 모든 정보를 전체 작업 코드로 정리했다.이 정보는 http://stackoverflow.com/questions/11906361/how-to-display-a-toast-in-a-timer – Sourav301

답변

5

당신은 타이머와 같은 별도의 스레드 내에서 UI 업데이트를 할 수 없습니다. UI 업데이트를 위해 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

감사합니다. .. 도와 줬어 .. :) – Monali

0

당신은이 작업을 수행 할 수 있도록 응용 프로그램의 컨텍스트에 액세스해야하는이

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

여전히 나왔다. 같은 오류 – Monali

0

에서 Handler 및 디스플레이 토스트를 만들 수 있습니다. 그런 다음 타이머에

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(); 
    } 

} 

: 입력 매개 변수로 컨텍스트를 취 자신의 클래스를 만드는 시도

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

이것은 나를 위해 작동하지 않았다! 여전히 같은 오류가 발생했습니다 : java.lang.RuntimeException : Looper.prepare()를 호출하지 않은 스레드 내부에서 처리기를 만들 수 없습니다. – robguinness

0

내 자신의 견해로 내 축배를 만들려고합니다.

나는 당신의 접근 방식을 성공적으로 결합했습니다. 다음 코드를 사용하면 토스트를 표시하고 충돌없이 뷰를 변경/제거 할 수 있습니다. MyTimerTask 생성자 매개 변수를 작업에 필요한 것으로 변경하면됩니다.

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

타이머에 토스트를 표시 할 수있는 간단한 프로젝트를 만들고 싶었습니다. 타이머는 서비스를 사용하여 시작됩니다. 그런 다음 서비스가 시작되면 타이머가 시작되고 서비스가 중지되면 타이머가 중지됩니다.

클래스 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)); 

} 

} 

클래스 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; 
} 

} 

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

가장 쉬운 방법은 (IMO)이다

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(); 
      } 
     }); 
    } 
}); 

키가 MyActivity.this.runOnUiThread (Runnable)입니다.

관련 문제