chaquo / chaquopy

Chaquopy: the Python SDK for Android
https://chaquo.com/chaquopy/
MIT License
819 stars 131 forks source link

Starting a web server causes the application to close itself #1235

Closed sametsoekel closed 1 month ago

sametsoekel commented 2 months ago

Chaquopy version

15.0.1

Devices or emulators where the issue happens

Xiaomi Redmi 12 128 GB

Relevant parts of your code

main.py


from flask import Flask, request, jsonify,json

app = Flask(__name__)

@app.route('/upload', methods=['POST'])
def upload():
    return 'zoo'

app.run(host='0.0.0.0',port=1616, debug=True)

MainActiviy.java

protected void onCreate(@Nullable Bundle savedInstanceState) {
      if (! Python.isStarted()) {
                  Python.start(new AndroidPlatform(this));
              }
      Python py = Python.getInstance();
      py.getModule("main");
      Toast.makeText(this, "Server running.", Toast.LENGTH_LONG).show();
}

Hi, I checked old Flask related issues and cannot figured it out how to solve this problem. I tried to run() wrapper for app.run() part and called that by py.getModule("main").callAttr("run") and the problem was still occuring. Building is completed with no errors but The app closes as soon as it opens. main.py works in my local (windows 10) without any errors.

Here is the logcat output :


java.lang.RuntimeException: Unable to start activity 
ComponentInfo{com.mykp.sdaew/com.mykp.sdaew.MainActivity}: com.chaquo.python.PyException: SystemExit: 1
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4043)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4203)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:99)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2616)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:222)
at android.os.Looper.loop(Looper.java:314)
at android.app.ActivityThread.main(ActivityThread.java:8706)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:565)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
Caused by: com.chaquo.python.PyException: SystemExit: 1
at <python>.werkzeug.serving.__init__(serving.py:773)
at <python>.werkzeug.serving.make_server(serving.py:921)
at <python>.werkzeug.serving.run_simple(serving.py:1084)
at <python>.flask.app.run(app.py:625)
at <python>.main.<module>(main.py:17)
at <python>.importlib._bootstrap._call_with_frames_removed(<frozen importlib._bootstrap>:219)
at <python>.importlib._bootstrap_external.exec_module(<frozen importlib._bootstrap_external>:843)
at <python>.java.android.importer.exec_module(importer.py:634)
at <python>.java.android.importer.exec_module(importer.py:721)
at <python>.importlib._bootstrap._load_unlocked(<frozen importlib._bootstrap>:671)
at <python>.importlib._bootstrap._find_and_load_unlocked(<frozen importlib._bootstrap>:975)
at <python>.importlib._bootstrap._find_and_load(<frozen importlib._bootstrap>:991)
at <python>.importlib._bootstrap._gcd_import(<frozen importlib._bootstrap>:1014)
at <python>.importlib.import_module(__init__.py:127)
at <python>.chaquopy_java.Java_com_chaquo_python_Python_getModuleNative(chaquopy_java.pyx:129)
at com.chaquo.python.Python.getModuleNative(Native Method)
at com.chaquo.python.Python.getModule(Python.java:84)
at com.mykp.sdaew.MainActivity.onCreate(MainActivity.java:67)
at android.app.Activity.performCreate(Activity.java:8886)
at android.app.Activity.performCreate(Activity.java:8851)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1470)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4025)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4203) 
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) 
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149) 
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:99) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2616) 
at android.os.Handler.dispatchMessage(Handler.java:106) 
at android.os.Looper.loopOnce(Looper.java:222) 
at android.os.Looper.loop(Looper.java:314) 
at android.app.ActivityThread.main(ActivityThread.java:8706) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:565) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081) 

Thanks in advance

sametsoekel commented 1 month ago

In case anyone else has this problem, I'll write my own solution here; when I passed Flask's debug= argument to false, for some reason I don't understand, the build completed without any problems and android app didn't close itself.

I also realized that since the server will always be up afterwards, it needs to be run with a one-time shot for the rest of android app's creation. I saw in a stackoverflow post that the package owner suggested solving this with dummy threading, and by putting the app.run() part in a function that works with fire and forget logic, I can keep the server up all the time.