Android在服务类中创建新线程

时间:2013-05-09 10:40:23

标签: java android multithreading class service

我创建了一个服务类,现在我正试图在这个类中运行一个新线程。服务是在我的MainActivity中启动的,这很有效。 Toast.Message部分中的第一个onCreate()显示,但我的帖子runa()中的消息未出现。认为它应该适用于新的Runnable()

public class My Service extends Service {
    private static final String TAG = "MyService";
    Thread readthread;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show(); //is shown

        readthread = new Thread(new Runnable() { public void run() { try {
            runa();
        } catch (Exception e) {
             //TODO Auto-generated catch block
            e.printStackTrace();
        } } });

        readthread.start(); 

        Log.d(TAG, "onCreate");


    }

    @Override
    public void onDestroy() {
        Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show();
        Log.d(TAG, "onDestroy");

    }

    @Override
    public void onStart(Intent intent, int startid) {

        //Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show();

        //Log.d(TAG, "onStart");

    }
    public void runa() throws Exception{

        Toast.makeText(this, "test", Toast.LENGTH_LONG).show(); //doesn't show up

    }
}

如果有人可以帮助我会很好:)

3 个答案:

答案 0 :(得分:5)

您正在创建的Thread将不会在MainThread上执行,因此您无法从中显示Toast。要从后台Toast显示Thread,您必须使用Handler,并使用Handler来显示Toast

private MyService extends Service {
    Handler mHandler=new Handler();
    //...

    public void runa() throws Exception{
        mHandler.post(new Runnable(){
            public void run(){
                Toast.makeText(MyService.this, "test", Toast.LENGTH_LONG).show()
            }
        }
    }    
}

这将是您确切问题的解决方案,虽然我认为它不是一个好的“架构”或练习,因为我不知道您想要实现的目标。

答案 1 :(得分:0)

您无法从非UI线程显示Toast。您的服务正在主线程上运行,但您正在后台线程中运行runa()方法。您必须使用处理程序并要求它在UI线程上显示Toast。请参阅this answer以了解如何完成此操作。

答案 2 :(得分:0)

从线程更新UI的最佳方法是使用处理程序或UIThread

试试此代码:,不要忘记先将服务放入Manifest文件。

class CapturingSerivce extends Service {
 Handler mHandler=new Handler();

@Override
public IBinder onBind(Intent intent) {
    return null;
}

 public void runa() throws Exception{
        mHandler.post(new Runnable(){
            public void run(){

            }
        });
    }    


@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    return super.onStartCommand(intent, flags, startId);
  }
}