gpt4 book ai didi

android - 在 Plugin.execute() 中实例化 AsyncTask 时出现 ExceptionInInitializerError

转载 作者:太空狗 更新时间:2023-10-29 16:21:14 26 4
gpt4 key购买 nike

我正在开发一个应用程序,我正在使用 cordova Api 在 Sencha 代码和 *Android native 代码之间进行通信*

在我的插件的 execute 方法中,我正在启动一个 AsyncTask(用于设备注册),但是我在 中得到了 ExceptionInInitializerError 第 36 行(TaskDeviceRegistration 的实例化)。

注册设备插件:

public class DeviceRegistrationPlugin extends Plugin {

public static final String TAG = "DeviceRegistrationPlugin";
public static final String ACTION_REGISTER_DEVICE = "registerDeviceAction";

protected String callBackMethod;

@Override
public PluginResult execute(String action, JSONArray args, String callBackId) {

String token;
if(action.equals(ACTION_REGISTER_DEVICE)) {
try {
token = args.getString(0);
if(token != null) {
// launch the task to register device
SharedPreferences prefs = cordova.getActivity().getSharedPreferences(WebServiceRequest.PREFS_IDENTIFICATION, Context.MODE_PRIVATE);
prefs.edit().putString(WebServiceRequest.PREF_TOKEN_PARAM, token).commit();
TaskRegisterDevice task = new TaskRegisterDevice(cordova.getActivity());// this is the line 36
task.execute();

// tell the plugin that the callBack will be executed after the task
// has finished his work.
this.callBackMethod = callBackId;
PluginResult pluginResult = new PluginResult(PluginResult.Status.NO_RESULT);
pluginResult.setKeepCallback(true);
return pluginResult;
}
else {
return new PluginResult(Status.ERROR, "token required");
}

} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return new PluginResult(PluginResult.Status.JSON_EXCEPTION);
}
}
else {
// invalid action sended to the plugin
return new PluginResult(PluginResult.Status.INVALID_ACTION);
}
}


/**
* asynctask to register the device
* @author houcine
*
*/
class TaskRegisterDevice extends AsyncTask<Void, Void, Boolean> {

protected Context context;

public TaskRegisterDevice(Context context) {
this.context = context;
}

@Override
protected Boolean doInBackground(Void... params) {
try {
return WebServiceRequest.RegisterDevice(context);
} catch (JSONException e) {
e.printStackTrace();
return true;
} catch (IOException e) {
e.printStackTrace();
return true;
}
}

@Override
protected void onPostExecute(Boolean result) {
// return new plugin result when synchronization done
Log.d(TAG, "resultat DeviceRegistration : "+result + " , \ncallBackMethod : "+callBackMethod);
PluginResult pluginResult = new PluginResult(
PluginResult.Status.OK, result);
pluginResult.setKeepCallback(false);
success(pluginResult, callBackMethod);
}

}

}

list 文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.myapp.activity"
android:versionCode="1"
android:versionName="1.0.2" >

<supports-screens
android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="true"
android:resizeable="true"
android:anyDensity="true"
/>

<uses-sdk android:minSdkVersion="5" android:targetSdkVersion="16"/>
//other stuff : declaration of <application> tag , activities , services...etc
>

和 logCat :

01-01 06:54:26.251: E/AndroidRuntime(6189): FATAL EXCEPTION: Thread-31
01-01 06:54:26.251: E/AndroidRuntime(6189): java.lang.ExceptionInInitializerError
01-01 06:54:26.251: E/AndroidRuntime(6189): at com.myapp.plugins.DeviceRegistrationPlugin.execute(DeviceRegistrationPlugin.java:36)
01-01 06:54:26.251: E/AndroidRuntime(6189): at org.apache.cordova.api.PluginManager$1.run(PluginManager.java:192)
01-01 06:54:26.251: E/AndroidRuntime(6189): at java.lang.Thread.run(Thread.java:1096)
01-01 06:54:26.251: E/AndroidRuntime(6189): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
01-01 06:54:26.251: E/AndroidRuntime(6189): at android.os.Handler.<init>(Handler.java:121)
01-01 06:54:26.251: E/AndroidRuntime(6189): at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421)
01-01 06:54:26.251: E/AndroidRuntime(6189): at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421)
01-01 06:54:26.251: E/AndroidRuntime(6189): at android.os.AsyncTask.<clinit>(AsyncTask.java:152)
01-01 06:54:26.251: E/AndroidRuntime(6189): ... 3 more

注意:该应用程序在 HTC ONE S、HTC ONE X、SAMSUNG GALAXY S II、SAMSUNG GALAXY SIII 和 android sdk 版本:4.0 或更高版本上运行良好,但不适用于 android 设备版本如:2.2.2、2.3.5、2.3.3

最佳答案

AsyncTask 应该在 UI 线程上创建和执行。看起来 DeviceRegistrationPlugin.execute() 方法是在主线程之外调用的,这就是您收到错误的原因。

你可以试试这样解决:

cordova.getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
TaskRegisterDevice task = new TaskRegisterDevice(cordova.getActivity());
task.execute();
}
});

关于android - 在 Plugin.execute() 中实例化 AsyncTask 时出现 ExceptionInInitializerError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14220794/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com