这就是我想要保持我的线程运行(它正在下载文件)的时候我开始一个意图(一个媒体播放器来播放正在下载的内容)。
问题是当我调用我的意图时,会自动调用onPause方法。
那么我应该怎么做才能避免这种情况?
public class MyActivity extends Activity {
MyThread my_thread;
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
//Starting My thread
my_thread = new MyThread();
my_thread.start();
// Starting the intent
Intent intent = new Intent("android.intent.action.VIEW");
intent.setDataAndType(uri, "video/*");
startActivity(intent);
@Override
protected void onPause() {
super.onPause();
// Stop my thread
my_thread.interrupt();
}
}
编辑:我正在下载一个实时流,所以除非用户决定关闭该活动,否则它没有结束。
答案 0 :(得分:2)
你可能想看一下AsyncTasks,它们允许在Android上为这些东西提供更好的多线程。
一个快速示例可能如下所示(来自http://developer.android.com/reference/android/os/AsyncTask.html):
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
// Escape early if cancel() is called
if (isCancelled()) break;
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + " bytes");
}
}
编辑:没看到它是连续的流,不要使用上面的代码。也许你应该把它放在原来的问题中?
答案 1 :(得分:0)
当你启动一个新的Activity时,总会调用一个扩展Activity类的OnPause事件,这就是你在startActivity(intent)中所做的事情。
如果您希望线程在退出应用程序时停止下载数据,那么我认为myThread.interrupt()进入OnPause回调的含义,请不要使用“OnPause”,而是选择其他事件。您可以在此处找到有关已启动事件的详细说明:Activity lifecycle
答案 2 :(得分:0)
您可以尝试以下方法之一:
DownloadManager
下载文件,完成后发送广播通知您已完成下载,并且活动可以使用下载的文件。这两篇文章(this和this)可以帮助您。IntentService
(即在串行后台线程上进行工作),下载文件,完成后您将发送包含可以找到文件的路径的广播意图。以下两篇文章可以帮助您IntentServices
(this和this)AsyncTask
。对于1和2:在您的活动中,您必须注册一个BroadcastReceiver
来处理上述意图。类似的东西:
public class MainActivity extends Activity {
protected BroadcastReceiver myDownloadCompleteReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if ("my_package.actions.DOWNLOAD_COMPLETE".equals(intent.getAction())) {
String filePath = intent.getStringExtra("DOWNLOAD_PATH");
// use the filePath
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
IntentFilter filter = new IntentFilter("my_package.actions.DOWNLOAD_COMPLETE");
LocalBroadcastManager.getInstance(this).registerReceiver(myDownloadCompleteReceiver, filter);
}
}