0

事情是这样的,当我启动一个意图(播放正在下载的内容的媒体播放器)时,我想保持我的线程运行(它正在下载文件)。

问题是当我调用我的意图时,会自动调用 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();

       } 
}

编辑:我正在下载一个实时流,所以除非用户决定关闭活动,否则它不会结束。

4

3 回答 3

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");
     }
 }

编辑:没有看到它是一个连续的流,不要使用上面的代码。也许你应该把它放在你原来的问题中?

于 2013-08-01T07:56:45.003 回答
0

扩展 Activity 的类的 OnPause 事件总是在您启动新 Activity 时调用,这就是您使用 startActivity(intent) 所做的事情。

如果您希望您的线程在退出应用程序时停止下载数据,这就是我认为 myThread.interrupt() 进入 OnPause 回调的含义,不要使用“OnPause”而是选择另一个事件。你可以在这里找到关于什么事件开始的很好的描述:活动生命周期

于 2013-08-01T07:51:32.303 回答
0

您可以尝试以下方法之一:

  1. (对于上面的 api 级别 9):DownloadManager用于下载文件,完成后发送广播通知您已完成下载并且 Activity 可以使用下载的文件。这两篇文章(thisthis)应该可以帮助你。
  2. 如果您也在为 Froyo 开发,则采用非常相似的方法:您可以启动一个IntentService(即在串行后台线程上工作),下载文件,完成后您将发送一个广播意图,其中包含可以找到文件。这里有两篇文章可以帮助你IntentServices这个这个
  3. 或者您可以使用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);
    }

}
于 2013-08-01T07:52:26.397 回答