完成一个类中的线程可以让另一个类知道它吗?

时间:2015-01-14 19:39:10

标签: android

在android中有一个活动(主要活动),它调用另一个类(不是活动)来做某事。此类启动一个线程以从服务器下载数据。下载完成后,我可以发送一条消息告诉主Activity类做些什么吗?我正在查看处理程序,但是Handler需要在同一个类中定义。还有其他我想念的东西吗?

编辑: 谢谢..但我的问题是线程是从其他类启动的。方案是我有一个绑定到服务并正在接收消息的活动。我将消息发送到处理消息的处理器类。我返回一个回复并发送一个新的请求。现在,对于我需要从服务器(在另一个类中)获取数据并下载它的消息之一,我需要发送响应。

2 个答案:

答案 0 :(得分:0)

是的,您可以使用在UI线程中创建的Handler,并从工作线程向其发布消息。

更通用的解决方案是使用可以处理应用中所有消息的Otto或GreenRobot等事件总线。我已经详细地写了a blog post

答案 1 :(得分:0)

我建议你使用AsyncTask,因为这是它的目的,而不是自己尝试。

如果AsyncTask不是您正在寻找的(例如下载需要花费太多时间,您希望让线程在后台运行等等),而您想做的就是做是GUI,你可以在线程上使用runOnUIThread

如果先前的解决方案是禁止的,您可以执行以下操作:

public class MainActivity extends Activity {

    private void startDownload() {
        // Start your thread passing this activity reference for example:
       YourThreadStartClass.startThreadedJob(this);
    }

    public void onDownloadFinish() {
         // Do your stuff on MainActivity after the download has finished
    }
}

public class YourThreadStartClass {
    public static void startThreadedJob(final MainActivity callback) {
        new Thread(new YourRunnable(callback)).start();
    }
}


// This is the Runnable your thread will be running
public class YourRunnable implements Runnable {

    private final MainActivity callback;

    public YourRunnable(final MainActivity activity) {
        this.callback = activity;
    }

    @Override
    public void run() {
         // Do your stuff on this thread and when finished:    
         this.callback.onDownloadFinish();
    }
}

编辑:我已经简化了一点,但在Java中实现这一目的的正确方法是定义一个像

这样的界面
public interface DownloadFinishedCallback {
    void onDownloadFinish();
}

并让您的MainActivity(或其他任何类)实现此界面,并使用DownloadFinishedCallback引用,而不是MainActivity中的YourRunnable引用。< / p>

接口示例:

public interface DownloadFinishedCallback {
    void onDownloadFinish();
}

public class MainActivity extends Activity implements DownloadFinishedCallback {

    private void startDownload() {
        // Start your thread passing this activity reference for example:
        YourThreadStartClass.startThreadedJob(this);
    }

    @Override
    public void onDownloadFinish() {
        // Do your stuff on MainActivity after the download has finished
    }
}

public class YourThreadStartClass {
    public static void startThreadedJob(final DownloadFinishedCallback callback) {
        new Thread(new YourRunnable(callback));
    }
}

// This is the Runnable your thread will be running
public class YourRunnable implements Runnable {

    private final DownloadFinishedCallback callback;

    public YourRunnable(final DownloadFinishedCallback callback) {
        this.callback = callback;
    }

    @Override
    public void run() {
        // Do your stuff on this thread and when finished:
        this.callback.onDownloadFinish();
    }
}