【问题标题】:Connection code not working for api level lower than 11 - doInBackground crash连接代码不适用于低于 11 的 api 级别 - doInBackground 崩溃
【发布时间】:2013-12-20 08:36:10
【问题描述】:

好的,我有一个过去可以正常工作的代码,但现在它不仅仅适用于低于 11 的设备。 一切开始都很好,在我的主要活动中我启动了一个AsyncTask,在doInBackground 内部出现了如下所示的错误:

    @Override
    protected Integer doInBackground(Integer... params) {
        final String info = getString(R.string.inf);
        final String post = getString(R.string.pos);
        final String main = getString(R.string.mai);

        String val1 = "";
        String val2 = "";
        String val3 = "";

        int connSucc = 3;

            try {
                JSONTokener sbTokener = new JSONTokener(Sources.httpGet(infoUrlStr).toString()); //==========>>It crashes right here

                JSONArray jArray=new JSONArray(sbTokener);
                for(int i=0; i<(jArray.length()); i++)
            {
                JSONObject json_obj_inf = jArray.getJSONObject(i);
             .
             .
             .

所以我检查了Sources.httpGet

public static StringBuilder httpGet (String urlStr) {
    StringBuilder err = new StringBuilder();
    hata.append("Error!");

    HttpURLConnection conn = null;
    BufferedReader rd = null;
    StringBuilder sb = null;
    try {
        URL url = new URL(urlStr);
        conn = (HttpURLConnection) url.openConnection();
        conn.setConnectTimeout(6000);
        conn.setReadTimeout(10000);
        if (conn.getResponseCode() >= 200 && conn.getResponseCode() <= 299) {
            rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            sb = new StringBuilder();
            String line;
            while ((line = rd.readLine()) != null) {
                sb.append(line);
            }
            rd.close();

            conn.disconnect();

        }
        else {
            return err;
        }
    }
    catch (NetworkOnMainThreadException a) {
        return err;
    }
    catch (Exception e) {
        return err;
    }
    finally {
        if (rd != null) {
            try {
                rd.close();
            } catch (IOException e) {
                return err;
            }
        }
        if (conn != null) {
            conn.disconnect();
        }
    }
    return sb;
}

我认为它甚至无法使用httpGet 方法。正如我所说,这适用于高于 11 的 api 级别。下面是我的 logcat,它对我没有太大帮助。

12-20 10:32:11.194: E/AndroidRuntime(357): FATAL EXCEPTION: AsyncTask #1
12-20 10:32:11.194: E/AndroidRuntime(357): java.lang.RuntimeException: An error occured while executing doInBackground()
12-20 10:32:11.194: E/AndroidRuntime(357):  at android.os.AsyncTask$3.done(AsyncTask.java:200)
12-20 10:32:11.194: E/AndroidRuntime(357):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
12-20 10:32:11.194: E/AndroidRuntime(357):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
12-20 10:32:11.194: E/AndroidRuntime(357):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
12-20 10:32:11.194: E/AndroidRuntime(357):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
12-20 10:32:11.194: E/AndroidRuntime(357):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
12-20 10:32:11.194: E/AndroidRuntime(357):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
12-20 10:32:11.194: E/AndroidRuntime(357):  at java.lang.Thread.run(Thread.java:1096)
12-20 10:32:11.194: E/AndroidRuntime(357): Caused by: java.lang.VerifyError: com.akilli.ticaret.source.Sources
12-20 10:32:11.194: E/AndroidRuntime(357):  at com.akilli.ticaret.Main$RestRequ.doInBackground(Main.java:130)
12-20 10:32:11.194: E/AndroidRuntime(357):  at com.akilli.ticaret.Main$RestRequ.doInBackground(Main.java:1)
12-20 10:32:11.194: E/AndroidRuntime(357):  at android.os.AsyncTask$2.call(AsyncTask.java:185)
12-20 10:32:11.194: E/AndroidRuntime(357):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
12-20 10:32:11.194: E/AndroidRuntime(357):  ... 4 more
12-20 10:32:13.064: E/WindowManager(357): Activity com.akilli.ticaret.Main has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@45fa6e78 that was originally added here
12-20 10:32:13.064: E/WindowManager(357): android.view.WindowLeaked: Activity com.akilli.ticaret.Main has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@45fa6e78 that was originally added here
12-20 10:32:13.064: E/WindowManager(357):   at android.view.ViewRoot.<init>(ViewRoot.java:247)
12-20 10:32:13.064: E/WindowManager(357):   at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
12-20 10:32:13.064: E/WindowManager(357):   at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
12-20 10:32:13.064: E/WindowManager(357):   at android.view.Window$LocalWindowManager.addView(Window.java:424)
12-20 10:32:13.064: E/WindowManager(357):   at android.app.Dialog.show(Dialog.java:241)
12-20 10:32:13.064: E/WindowManager(357):   at com.akilli.ticaret.Main$RestRequ.onPreExecute(Main.java:111)
12-20 10:32:13.064: E/WindowManager(357):   at android.os.AsyncTask.execute(AsyncTask.java:391)
12-20 10:32:13.064: E/WindowManager(357):   at com.akilli.ticaret.Main$1.onClick(Main.java:50)
12-20 10:32:13.064: E/WindowManager(357):   at android.view.View.performClick(View.java:2408)
12-20 10:32:13.064: E/WindowManager(357):   at android.view.View$PerformClick.run(View.java:8816)
12-20 10:32:13.064: E/WindowManager(357):   at android.os.Handler.handleCallback(Handler.java:587)
12-20 10:32:13.064: E/WindowManager(357):   at android.os.Handler.dispatchMessage(Handler.java:92)
12-20 10:32:13.064: E/WindowManager(357):   at android.os.Looper.loop(Looper.java:123)
12-20 10:32:13.064: E/WindowManager(357):   at android.app.ActivityThread.main(ActivityThread.java:4627)
12-20 10:32:13.064: E/WindowManager(357):   at java.lang.reflect.Method.invokeNative(Native Method)
12-20 10:32:13.064: E/WindowManager(357):   at java.lang.reflect.Method.invoke(Method.java:521)
12-20 10:32:13.064: E/WindowManager(357):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
12-20 10:32:13.064: E/WindowManager(357):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
12-20 10:32:13.064: E/WindowManager(357):   at dalvik.system.NativeStart.main(Native Method)

非常感谢您的帮助,我可能犯了一个新手错误,它说窗口泄漏的原因可能是因为它甚至在关闭对话框之前就崩溃了。

【问题讨论】:

  • @laalto 是否有办法让我“知道”代码不再适用于低于 11 的 API 级别?我怎样才能跟上节奏,又不会弄得一团糟?
  • Android Lint 通常可以很好地针对 minSdkLevel 中不可用的内容发出警告。因此,请注意警告并定期运行完整的项目 lint。
  • @laalto 对,会做的,非常感谢!

标签: android android-asynctask http-get


【解决方案1】:

您可能正在使用一些不支持 Android 的库

以后,请在 stackoverflow 中搜索您的 Java 异常。 Getting "Caused by: java.lang.VerifyError:"

【讨论】:

  • 我正在使用 android-support-v7-appcompat 和/或 v4,实际上我没有为这段代码使用任何库
  • 但是我的库是正确的:
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-20
  • 1970-01-01
  • 1970-01-01
  • 2019-06-09
  • 2018-12-09
相关资源
最近更新 更多