Activity产生一个线程,但随后活动被破坏或者在子线程完成之前创建一个新的活动(在同一个任务中)

时间:2011-02-19 16:35:40

标签: java android multithreading

如果子线程的回调方法存在于被销毁的Activity中,或者现在不是堆栈顶部的Activity,会发生什么? 这个原因和例外吗?如果是这样,处理这类问题的最佳做法是什么?谢谢!

3 个答案:

答案 0 :(得分:0)

如果要监视任务完成时间,可以使用Future类。

其他替代方法是在Handler中发布任务,如果您只想阻止他们使用RemoveCallback(Runnable r)

答案 1 :(得分:-1)

你也可以在一个非活动和一个简单的.java类的中心类中维护你的代码片段

答案 2 :(得分:-1)

你应该让你的线程像这样工作:

class Job extends Thread {
    Activity activity;
    boolean needsFinishing;

    Job(Activity activity) {
        this.activity = activity;
    }

    synchronized void detachActivity() {
        activity = null;
    }

    synchronized void attachActivity(Activity activity) {
        this.activity = activity;
        if (needsFinishing) {
            finished();
        }
    }

    public void run() {
        // do long running job

        finished();
    }

    synchronized void finished() {
        if (activity != null) {
            needsFinishing = false;
            activity.runOnUiThread(new Runnable() {
                public void run() {
                    // do your stuff with the activity
                }
            });
        } else {
            needsFinishing = true;
        }
    }
}

活动:

class MyActivity extends Activity {
    Job job;

    void onCreate(Bundle bundle) {
        job = (Job) getNonConfigurationInstance();
    }

    void onResume() {
        if (job != null) {
            job.attachActivity(this);
        }
    }

    void onPause() {
        if (job != null) {
            job.detachActivity();
        }
    }

    Object onRetainNonConfigurationInstance() {
        return job;
    }

    // create and start your job somewhere between onCreate and onPause
}

这将确保线程仅在适当时访问活动。它也将处理方向变化。 注意,代码并不完美,因为我没有方便检查错误的java / android环境。