繁体   English   中英

一类的线程完成后可以让另一类知道吗?

[英]Thread in one class on completed can it let another class know about it?

提示:本站提供中英文对照查看,鼠标放在中文字句上可显示英文原文。 若本文未解决您的问题,推荐您尝试使用帮您解决。

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

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

是的,您可以使用在您的UI线程中创建的Handler程序,并通过工作线程将消息发布到该处理程序。

更通用的解决方案是使用事件总线,例如Otto或GreenRobot,它们可以处理应用程序中的所有消息传递。 我写了一篇关于此的博客文章

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

如果不是您想要的AsyncTask (例如,下载花费了太多时间,您想让线程在后台运行,等等...),而您要做的就是GUI,您可以使用runOnUIThread上的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 (或与此有关的任何其他类)实现此接口,并在YourRunnable使用DownloadFinishedCallback引用而不是MainActivity YourRunnable

接口示例:

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();
    }
}
问题未解决?试试使用:帮您解决问题。
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2023 STACKOOM.COM