0

我有一个只包含各种数据库查询的静态函数的类。由于它们都与网络相关,我需要在另一个线程中执行该代码。我正在尝试找到实现这一点的最佳方法。

public class MyClass {

    public static void someFunction() {
        ...
    }

    public static void anotherFunction() {
        ...
    }

}

我正在考虑这样做:

public class MyClass {

    public static void someFunction() {
        new AsyncTask<Void, Void, Void>() {
            @Override
            protected Void doInBackground(Void... params) {
                ...
            }
        }
    }

    public static void anotherFunction() {
        new AsyncTask<Void, Void, Void>() {
            @Override
            protected Void doInBackground(Void... params) {
                ...
            }
        }
    }

}

或者当我调用这些函数时创建一个新线程:

new AsyncTask<Void, Void, Void>() {
    @Override
    protected Void doInBackground(Void... params) {
        MyClass.someFunction();
    }
}

new AsyncTask<Void, Void, Void>() {
    @Override
    protected Void doInBackground(Void... params) {
        MyClass.anotherFunction();
    }
}

最后,我想知道是否有一种方法可以运行与主线程并行的单个线程,该线程将专门处理这些函数调用。主线程将调用这些函数,而另一个线程将运行它们。

有没有人对实现这一点的最佳方法有任何想法?谢谢!

4

3 回答 3

0

阅读有关ExecutorService. ExecutorService允许您根据需要管理线程。如果您希望您的线程按顺序生成,您可以简单地使用ExecutorService ex = Executors.newSingleThreadExecutor()并随后将所有线程添加到这个单个 executorService。

ex.submit(runnableInstance)

但是,我也遇到了您面临的完全相同的问题。我还使用线程从数据库中查询。但是,它使我的代码看起来很乱。如果涉及简单操作,我建议您在主线程中使用查询。它几乎不会给应用程序的响应带来任何延迟。这样,您的代码将非常易于管理。

编辑 :

很久以前,我还阅读了有关CursorLoader允许您在后台运行查询并可以通过实现来使用的类LoaderManager.LoaderCallbacks<Cursor>。这样,您不必编写丑陋的代码来在后台执行每个查询。但是,要使用它,您需要将数据库包装在 ContentProvider.

于 2013-04-19T02:14:10.177 回答
0

标准 Java 并发实用程序最适合这种情况。

例如:

private static final ExecutorService exe = Executors.newSingleThreadExecutor();
...
exe.execute(new Runnable() {
    public void run() {
        ...
        someFunction();
        ...
    }
});
于 2013-04-19T02:08:39.983 回答
0

我相信对您来说最简单的解决方案是使用IntentService

从安卓文档中提取

All requests are handled on a single worker thread -- they may take as long as necessary (and will not block the application's main loop), but only one request will be processed at a time. 

你只需要处理onHandleIntent

它为您做了很多工作,并且由于它是服务的子类,您可以直接或以其他方式(Intent..etc)绑定到服务以获取数据。

于 2013-04-19T02:31:09.940 回答