在android中有一个活动(主要活动),它调用另一个类(不是活动)来做某事。此类启动一个线程以从服务器下载数据。下载完成后,我可以发送一条消息告诉主Activity类做些什么吗?我正在查看处理程序,但是Handler需要在同一个类中定义。还有其他我想念的东西吗?
编辑: 谢谢..但我的问题是线程是从其他类启动的。方案是我有一个绑定到服务并正在接收消息的活动。我将消息发送到处理消息的处理器类。我返回一个回复并发送一个新的请求。现在,对于我需要从服务器(在另一个类中)获取数据并下载它的消息之一,我需要发送响应。
答案 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();
}
}
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();
}
}