繁体   English   中英

Android网络和线程

[英]Android Networking and Threading

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

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

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

是否有人对实现此目标的最佳方法有任何想法? 谢谢!

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

例如:

private static final ExecutorService exe = Executors.newSingleThreadExecutor();
...
exe.execute(new Runnable() {
    public void run() {
        ...
        someFunction();
        ...
    }
});

了解有关ExecutorService ExecutorService允许您根据需要管理线程。 如果希望线程按顺序生成,则可以简单地使用ExecutorService ex = Executors.newSingleThreadExecutor()然后将所有线程添加到此executorService中。

ex.submit(runnableInstance)

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

编辑:

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

我相信最适合您的解决方案是使用IntentService

从android doc提取

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)绑定到服务以获取数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM