小编And*_*nik的帖子

我应该在Android AsyncTask中调用super.onPostExecute(result)吗?

我想知道在Android AsyncTask中调用super.onPostExecute(result)或super.onPreExecute是否有任何意义?我一直在调用它们,但即使在关于AsyncTask(Android API参考:AsyncTask)的Android文档中,它们也被省略了.如果我打电话给他们是否有意义呢?

android android-asynctask

34
推荐指数
1
解决办法
6856
查看次数

Android中的新线程(任务).start()VS ThreadPoolExecutor.submit(任务)

在我的Android项目中,我有很多地方需要异步运行一些代码(Web请求,调用db等).这不是长时间运行的任务(最多几秒钟).到目前为止,我正在创建一个新线程,通过任务传递一个新的runnable.但是最近我读了一篇关于Java中的线程和并发的文章,并且理解为每个任务创建一个新的Thread并不是一个好的决定.

所以现在我ThreadPoolExecutor在我的Application类中创建了一个包含5个线程的类.这是代码:

public class App extends Application {

    private ThreadPoolExecutor mPool;

    @Override
    public void onCreate() {
        super.onCreate();

        mPool =  (ThreadPoolExecutor)Executors.newFixedThreadPool(5);
    }
}
Run Code Online (Sandbox Code Playgroud)

我还有一种方法可以将Runnable任务提交给执行者:

public void submitRunnableTask(Runnable task){
    if(!mPool.isShutdown() && mPool.getActiveCount() != mPool.getMaximumPoolSize()){
        mPool.submit(task);
    } else {
        new Thread(task).start();
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,当我想在我的代码中运行异步任务时,我得到实例App并调用submitRunnableTask将runnable传递给它的方法.正如你所看到的,我也检查一下,如果线程池有自由线程来执行我的任务,如果没有,我创建一个新线程(我不认为这会发生,但无论如何......我不知道我希望我的任务在队列中等待并减慢应用程序).

onTerminateApplication 的回调方法中,我关闭了池.

所以我的问题如下:这种模式比代码中创建新的线程更好吗?我的新方法有哪些优点和缺点?它会引起我不知道的问题吗?你能告诉我一些比这更好的东西来管理我的异步任务吗?

PS我在Android和Java方面有一些经验,但我远不是一个并发大师.所以可能有些方面我在这类问题中不太了解.任何建议将被认真考虑.

java multithreading android asynchronous threadpoolexecutor

15
推荐指数
2
解决办法
1万
查看次数

有关MIPS处理器的Android设备的统计数据

我在我的项目中使用本机库.我已经为ARM,ARMv7和x86架构构建它们,只是想知道我是否应该为MIPS构建它们?我在哪里可以找到有关Android设备的哪些部分在MIPS处理器上运行的任何统计信息.我想了解它是否有意义使我的APK在4 - 5 MB大,因为MIPS库.

android mips

12
推荐指数
1
解决办法
6389
查看次数

Retrofit 2使用HttpLoggingInterceptor.Level.BODY在日志中打印空响应主体

我用Retrofit 2.0.0.这是构建我的HTTP客户端的代码

protected OkHttpClient getHttpClient(){
        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        builder.addInterceptor(
                chain -> {
                    Request original = chain.request();

                    Request.Builder requestBuilder = original.newBuilder();

                    requestBuilder.header("Accept-Language", App.getInstance().getPrefs().getSelectedLanguage().toLowerCase());
                    requestBuilder.header("Accept-Encoding", "gzip");

                    if(API.this instanceof PrivateAPI){
                        LoginResponse loginResponse = AuthManager.getInstanse().getLoginResponse();
                        requestBuilder.header("Authorization", String.format("%s %s",
                                loginResponse.getTokenType(),
                                loginResponse.getAccessToken()));
                    }

                    requestBuilder.method(original.method(), original.body());

                    Request request = requestBuilder.build();
                    return chain.proceed(request);
                });

        if(BuildConfig.DEBUG){
            HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
            loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
            builder.addInterceptor(loggingInterceptor);
        }

        return builder.build();
    }
Run Code Online (Sandbox Code Playgroud)

以下是我如何使用它来初始化我的Retrofit API接口:

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create(getGson()))
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .client(getHttpClient())
            .build();

    apiService = retrofit.create(PrivateAPIInterface.class);
Run Code Online (Sandbox Code Playgroud)

直到昨天我才得到完整的登录logcat,因为它应该是.但突然间,我开始在我的日志中找到空的响应主体.所以这是我现在获得的日志示例:

  D/OkHttp: --> …
Run Code Online (Sandbox Code Playgroud)

android retrofit2

9
推荐指数
1
解决办法
2390
查看次数

NativeDecodeFileDescriptor中的NewFromFD失败 - Android 4.4

我使用Android示例项目ContactsList(http://developer.android.com/shareables/training/ContactsList.zip)作为示例在我的应用程序中开发联系人Activity.它在所有Android版本上都运行良好,但在Android 4.4中没有加载联系人图像,我收到以下错误:

 NewFromFD failed in nativeDecodeFileDescriptor
Run Code Online (Sandbox Code Playgroud)

执行此方法时会发生这种情况:

BitmapFactory.decodeFileDescriptor(fileDescriptor, null, options);
Run Code Online (Sandbox Code Playgroud)

它总是返回null.

要获取fileDescriptor本身,我使用此方法:

private Bitmap loadContactPhotoThumbnail(String photoData, int imageSize) {
    if (!isAdded() || getActivity() == null) {
        return null;
    }

    AssetFileDescriptor afd = null;
    try {
        Uri thumbUri;

        if (Utils.hasHoneycomb()) {
            thumbUri = Uri.parse(photoData);
            Log.d("imageloader", photoData);
        } else {
            final Uri contactUri = Uri.withAppendedPath(Contacts.CONTENT_URI,photoData);

            thumbUri = Uri.withAppendedPath(contactUri, Photo.CONTENT_DIRECTORY);
        }

        afd = getActivity().getContentResolver().openAssetFileDescriptor(thumbUri, "r");
        Log.d("imageloader", afd.toString());

        FileDescriptor fileDescriptor = null;

        try{
            fileDescriptor = afd.getFileDescriptor();
            Log.d("imageloader", fileDescriptor.toString());
        } catch …
Run Code Online (Sandbox Code Playgroud)

android

6
推荐指数
1
解决办法
564
查看次数

Android Oreo 电池优化导致 FCM 延迟

我已经实现了 FCM,就像 if 的文档所说:

我有这样的服务 public class TCMessagingService extends FirebaseMessagingService

我已经在清单中声明了它,如下所示:

<service android:name=".services.TCMessagingService">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
</service>
Run Code Online (Sandbox Code Playgroud)

我使用 SDK 级别 25 进行定位和编译,我的 firebase 版本是 10.2.1。

现在的问题是,在 Android 8.0 上,有时我收到推送通知时会出现巨大的延迟。几分钟后就会出现。但情况并非总是如此,有时事情会像预期的那样进行,推送通知来得很快。

我尝试将 FCM 版本更新到最新版本,但这没有帮助。

但是,当我在设置中关闭应用程序的电池优化时,一切正常。但这不是解决方案。我该怎么做才能使 FCM 在 Android 8.0 上按预期工作?

android firebase-cloud-messaging android-8.0-oreo

5
推荐指数
1
解决办法
3321
查看次数

java.lang.NoClassDefFoundError:无法初始化类 - Kotlin 对象

我有一个使用 Kotlin 的多模块化 Gradle 项目。其中一个模块具有 main 方法以及对其他模块的依赖关系。我需要从这个模块创建一个可执行的 jar。所以我尝试通过创建这样的 Jar 任务来做到这一点

jar {
    manifest {
        attributes(
                'Main-Class': 'my_package.RunnerKt'
        )
    }
    from {
        configurations.compileClasspath.filter{ it.exists() }.collect { it.isDirectory() ? it : zipTree(it) }
    }
}
Run Code Online (Sandbox Code Playgroud)

我还尝试了Shadow Gradle 插件。在这两种情况下,胖罐子都是按预期创建的,它似乎拥有我所有的类和依赖项。但是当我运行 jar 时,java -jar出现以下错误: java.lang.NoClassDefFoundError: Could not initialize class my_kotlin_object_classwhere my_kotlin_object_classis just a kotlin objectwith some variables.

在堆栈跟踪中,没有其他异常可能导致此异常,因此似乎只是此类本身存在问题。当我查看罐子时,我可以在那里看到这个文件。

我不明白这是 kotlin 对象本身和可执行 jar 的问题,还是我做错了什么?

java executable-jar gradle kotlin fatjar

5
推荐指数
1
解决办法
2951
查看次数

RxJava-检查条件并仅在条件为true时重复一次

我曾经RxJava + Retrofit在Android应用中进行API调用。在某些情况下,用户发出请求并且其令牌已过期。在这种情况下,我会在中收到正常响应onNext,但响应中不包含结果,而是包含一些代码的error元素。如果发生这种情况,我需要重新登录用户,并且仅在获得新令牌后才重复原始请求。所以我想用来组织这个RxJava。为了使事情变得容易,我将举一个简单的例子。假设我有以下方法:

public void test(int someInt){
    Observable.just(someInt)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Subscriber<Integer>() {
                @Override
                public void onCompleted() {
                    log("onCompleted");
                }

                @Override
                public void onError(Throwable e) {
                    e.printStackTrace();
                    log("onError");
                }

                @Override
                public void onNext(Integer integer) {
                    log("onNext - " + integer);
                }
            });
Run Code Online (Sandbox Code Playgroud)

我想检查if (someInt == 0) 之前 onNext()被称为。如果我得到,false我想继续并被onNext()调用,但是如果我得到,true我想执行一些操作并仅重复一次原始可观察的,如果条件第二次返回false,我就不想再重复一次。

有人可以帮我弄清楚我对此有什么选择吗?PS我是RX世界的新手。

java android reactive-programming rx-java

4
推荐指数
1
解决办法
5014
查看次数

如何在阻塞的网络中隧道传输voip流量

我有一个Android VOIP应用程序.由于一些网络阻止VOIP流量,我想找到一些方法绕过该块.我认为VPN可以做到这一点,但没有任何VPN解决方案可以轻松实现.使用Android提供的VPN API,您需要自己实现几乎所有内容(例如,那里没有任何协议实现).

那么还有其他方法可以实现我的需求吗?可能是SSH隧道或任何其他类型的隧道?

任何建议都会有所帮助,因为我不知道从哪里开始.

vpn sip tunneling

2
推荐指数
1
解决办法
8342
查看次数

Kotlin 检查数据类属性是否全部为 null

假设我有一个具有可为空属性的数据类:

data class User(
   val fName: String?,
   val lName: String?)
Run Code Online (Sandbox Code Playgroud)

在一个函数中,即使该实例不为空,我也会收到此类的实例,我想检查内部的至少一个属性是否已初始化且不为空。我知道我可以一一检查属性,但我想要一些更通用的东西,我用谷歌搜索了一下,似乎 Kotlin 没有这方面的扩展功能,所以我实现了一个,想与您分享并检查是否有人知道更好方法。

reflection kotlin

2
推荐指数
1
解决办法
4537
查看次数

Java中可以有'var'关键字吗?

我的问题看起来很愚蠢......对我而言,这看起来真的很愚蠢.但是我很震惊地看到var关于android的视频教程中的java代码中的关键字,你可以在这里看到它,例如38分钟......

所以我的问题是,如何var在java代码中拥有它以及它在java中意味着什么,我们在没有特定类型的情况下不能有引用?

java android

0
推荐指数
2
解决办法
3190
查看次数