【问题标题】:ExecuterService's execute() method not executing sometimes even though when it's not shutdown or terminated - AndroidExecutorService execute() 方法有时不会执行,即使它没有关闭或终止 - Android
【发布时间】:2022-10-24 12:46:50
【问题描述】:

在我的多线程应用程序中,为了防止应用程序没有响应(ANR),我使用 ExecutorService 对象的执行 API 来调用 startActvity()。大多数时候它按预期工作。我能够看到日志callIntent: startingrun: inside run,但是在我多次重新启动设备并尝试调用callIntent(context,intent) 后,它有时无法正常工作。这是奇怪的行为。

这个实现出了什么问题?

当我使用主/UI线程时,我得到了ANR并且我已经运行了 HandlerThread 运行这个 startActivity,但行为相同

executor 没有关闭也没有终止,但是执行失败

import android.app.Application;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class App extends Application {
    private static final String TAG = "##App##";
    private ExecutorService executorService;

    @Override
    public void onCreate() {
        super.onCreate();
        executorService= Executors.newSingleThreadExecutor();
    }

    public void callIntent(Context context, Intent intent){
        Log.d(TAG, "callIntent: starting");
        if(executor.isShutdown()||executor.isTerminated()){
            Log.d(TAG, "callStartActivity executor is shutdown - restarting again ");
            executor = Executors.newSingleThreadExecutor();
        }else{
            Log.d(TAG, "callStartActivity:not shut or trminated ");
        }
        executorService.execute(new Runnable() {
            @Override
                public void run() {
                    Log.d(TAG, "run: inside run ");
                    context.startActivity(intent);
                }
            });
        }
    }
}

【问题讨论】:

  • 提示:捕获并记录您传递给ExcecutorServiceRunnable 中的所有异常,否则线程可能会默默地死掉并且您的ExecutorService 将停止接受新工作。
  • 这里没有抛出异常

标签: java android multithreading executorservice


【解决方案1】:

我不知道确切的原因,但我使用了Executors.newFixedThreadPool(4);,并将线程数保持为 4,没有计算线程数 4,但它对我有用,

任何人都知道这个原因,请编辑这个答案并为此添加正当理由

public class App extends Application {
    private static final String TAG = "##App##";
    private ExecutorService executorService;

    @Override
    public void onCreate() {
        super.onCreate();
        executorService= Executors.newFixedThreadPool(4);
    }

    public void callIntent(Context context, Intent intent){
        Log.d(TAG, "callIntent: starting");
        if(executor.isShutdown()||executor.isTerminated()){
            Log.d(TAG, "callStartActivity executor is shutdown - restarting again ");
            executor = Executors.newSingleThreadExecutor();
        }else{
            Log.d(TAG, "callStartActivity:not shut or trminated ");
        }
        executorService.execute(new Runnable() {
            @Override
                public void run() {
                    Log.d(TAG, "run: inside run ");
                    context.startActivity(intent);
                }
            });
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-18
    • 1970-01-01
    相关资源
    最近更新 更多