如何处理 Java/Android 中的慢速网络连接

2023-11-27

我有一个应用程序需要多次调用 MySQL 数据库;它在一个AsyncTask。下面是一个可能看起来像的示例。

我的主要问题是这样的;有时,主机(Godaddy,呃)决定停止连接,而我的progressDialog加载、加载、加载更多,直到强行关闭并且应用程序崩溃。特别是如果用户试图中断它(但是,大多数我都设置为不可取消)。

有没有比我下面更好的方法来处理这个问题?我正在做try/catch,但不知道如何利用它来为我带来好处。

class Task extends AsyncTask<String, String, Void> {
        private ProgressDialog progressDialog = new ProgressDialog(
                MasterCat.this);
        InputStream is = null;
        String result = "";

        protected void onPreExecute() {
            progressDialog.setMessage("Loading...");
            progressDialog.show();
            progressDialog.setCancelable(false);
        }

        @Override
        protected Void doInBackground(String... params) {
            String url_select = "http://www.---.com/---/master.php";

            HttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url_select);
            ArrayList<NameValuePair> param = new ArrayList<NameValuePair>();

            try {
                httpPost.setEntity(new UrlEncodedFormEntity(param));
                HttpResponse httpResponse = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpResponse.getEntity();

                // read content
                is = httpEntity.getContent();

            } catch (Exception e) {

                Log.e("log_tag", "Error in http connection " + e.toString());
            }
            try {
                BufferedReader br = new BufferedReader(
                        new InputStreamReader(is));
                StringBuilder sb = new StringBuilder();
                String line = "";
                while ((line = br.readLine()) != null) {
                    sb.append(line + "\n");
                }
                is.close();
                result = sb.toString();

            } catch (Exception e) {
                // TODO: handle exception
                Log.e("log_tag", "Error converting result " + e.toString());
            }

            return null;

        }

        protected void onPostExecute(Void v) {

            String cat;
            try {
                jArray = new JSONArray(result);
                JSONObject json_data = null;
                for (int i = 0; i < jArray.length(); i++) {
                    json_data = jArray.getJSONObject(i);
                    cat = json_data.getString("category");

                    cats.add(cat);

                }
            } catch (JSONException e1) {
                Toast.makeText(getBaseContext(), "No Categories Found",
                        Toast.LENGTH_LONG).show();
            } catch (ParseException e1) {
                e1.printStackTrace();
            }

            ListView listView = getListView();
            listView.setTextFilterEnabled(true);

            listView.setOnItemClickListener(new OnItemClickListener() {

                public void onItemClick(AdapterView<?> arg0, View arg1,
                        int arg2, long id) {

                    Intent i = new Intent(getApplicationContext(), Items.class);
                    i.putExtra("category", cats.get(arg2));
                    startActivity(i);

                }
            });

            progressDialog.dismiss();

            MasterCatAdapter adapter = new MasterCatAdapter(MasterCat.this,
                    cats);
            setListAdapter(adapter);

        }
    }

编辑:现在我假设强制关闭是因为连接不良;但当我可以重新创建它时,我会尝试将它启动。

Edit2:这是LogCat:

08-13 14:57:00.580: E/WindowManager(2262): Activity com.---.---.MyFragmentActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@42b02cd0 that was originally added here
08-13 14:57:00.580: E/WindowManager(2262): android.view.WindowLeaked: Activity com.---.---.MyFragmentActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@42b02cd0 that was originally added here
08-13 14:57:00.580: E/WindowManager(2262):  at android.view.ViewRootImpl.<init>(ViewRootImpl.java:374)
08-13 14:57:00.580: E/WindowManager(2262):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:292)
08-13 14:57:00.580: E/WindowManager(2262):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:224)
08-13 14:57:00.580: E/WindowManager(2262):  at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:149)
08-13 14:57:00.580: E/WindowManager(2262):  at android.view.Window$LocalWindowManager.addView(Window.java:547)
08-13 14:57:00.580: E/WindowManager(2262):  at android.app.Dialog.show(Dialog.java:277)
08-13 14:57:00.580: E/WindowManager(2262):  at com.---.---.MyFragmentActivity$RateFragment$RatingTask.onPreExecute(MyFragmentActivity.java:374)
08-13 14:57:00.580: E/WindowManager(2262):  at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586)
08-13 14:57:00.580: E/WindowManager(2262):  at android.os.AsyncTask.execute(AsyncTask.java:534)
08-13 14:57:00.580: E/WindowManager(2262):  at com.---.---.MyFragmentActivity$RateFragment$insertTask.onPostExecute(MyFragmentActivity.java:520)
08-13 14:57:00.580: E/WindowManager(2262):  at com.---.---.MyFragmentActivity$RateFragment$insertTask.onPostExecute(MyFragmentActivity.java:1)
08-13 14:57:00.580: E/WindowManager(2262):  at android.os.AsyncTask.finish(AsyncTask.java:631)
08-13 14:57:00.580: E/WindowManager(2262):  at android.os.AsyncTask.access$600(AsyncTask.java:177)
08-13 14:57:00.580: E/WindowManager(2262):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
08-13 14:57:00.580: E/WindowManager(2262):  at android.os.Handler.dispatchMessage(Handler.java:99)
08-13 14:57:00.580: E/WindowManager(2262):  at android.os.Looper.loop(Looper.java:137)
08-13 14:57:00.580: E/WindowManager(2262):  at android.app.ActivityThread.main(ActivityThread.java:4745)
08-13 14:57:00.580: E/WindowManager(2262):  at java.lang.reflect.Method.invokeNative(Native Method)
08-13 14:57:00.580: E/WindowManager(2262):  at java.lang.reflect.Method.invoke(Method.java:511)
08-13 14:57:00.580: E/WindowManager(2262):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
08-13 14:57:00.580: E/WindowManager(2262):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
08-13 14:57:00.580: E/WindowManager(2262):  at dalvik.system.NativeStart.main(Native Method)
08-13 14:57:00.588: D/AndroidRuntime(2262): Shutting down VM
08-13 14:57:00.588: W/dalvikvm(2262): threadid=1: thread exiting with uncaught exception (group=0x4200b300)
08-13 14:57:00.596: E/AndroidRuntime(2262): FATAL EXCEPTION: main
08-13 14:57:00.596: E/AndroidRuntime(2262): java.lang.NullPointerException
08-13 14:57:00.596: E/AndroidRuntime(2262):     at com.---.---.MyFragmentActivity$RateFragment$RatingTask.onPostExecute(MyFragmentActivity.java:461)
08-13 14:57:00.596: E/AndroidRuntime(2262):     at com.---.---.MyFragmentActivity$RateFragment$RatingTask.onPostExecute(MyFragmentActivity.java:1)
08-13 14:57:00.596: E/AndroidRuntime(2262):     at android.os.AsyncTask.finish(AsyncTask.java:631)
08-13 14:57:00.596: E/AndroidRuntime(2262):     at android.os.AsyncTask.access$600(AsyncTask.java:177)
08-13 14:57:00.596: E/AndroidRuntime(2262):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
08-13 14:57:00.596: E/AndroidRuntime(2262):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-13 14:57:00.596: E/AndroidRuntime(2262):     at android.os.Looper.loop(Looper.java:137)
08-13 14:57:00.596: E/AndroidRuntime(2262):     at android.app.ActivityThread.main(ActivityThread.java:4745)
08-13 14:57:00.596: E/AndroidRuntime(2262):     at java.lang.reflect.Method.invokeNative(Native Method)
08-13 14:57:00.596: E/AndroidRuntime(2262):     at java.lang.reflect.Method.invoke(Method.java:511)
08-13 14:57:00.596: E/AndroidRuntime(2262):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
08-13 14:57:00.596: E/AndroidRuntime(2262):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
08-13 14:57:00.596: E/AndroidRuntime(2262):     at dalvik.system.NativeStart.main(Native Method)

编辑:这是位于不同活动中但在 LogCat 中引用的任务:

class RatingTask extends AsyncTask<String, String, Void> {

            private ProgressDialog progressDialog = new ProgressDialog(
                    getActivity());

            InputStream is = null;
            String result = "";

            protected void onPreExecute() {
                progressDialog.setMessage("Loading...");
                progressDialog.show();
                progressDialog.setOnCancelListener(new OnCancelListener() {

                    public void onCancel(DialogInterface dialog) {
                        RatingTask.this.cancel(true);
                    }
                });
            }

            @Override
            protected Void doInBackground(String... params) {
                String url_select = "http://www.---.com/---/get_ratings.php";

                ArrayList<NameValuePair> param = new ArrayList<NameValuePair>();
                param.add(new BasicNameValuePair("item", Item));
                param.add(new BasicNameValuePair("category", Category));

                HttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(url_select);

                try {
                    httpPost.setEntity(new UrlEncodedFormEntity(param));
                    HttpResponse httpResponse = httpClient.execute(httpPost);
                    HttpEntity httpEntity = httpResponse.getEntity();

                    // read content
                    is = httpEntity.getContent();

                } catch (Exception e) {

                    Log.e("log_tag", "Error in http connection " + e.toString());
                }
                try {
                    BufferedReader br = new BufferedReader(
                            new InputStreamReader(is));
                    StringBuilder sb = new StringBuilder();
                    String line = "";
                    while ((line = br.readLine()) != null) {
                        sb.append(line + "\n");
                    }
                    is.close();
                    result = sb.toString();

                } catch (Exception e) {
                    Log.e("log_tag", "Error converting result " + e.toString());
                }

                return null;

            }

            protected void onPostExecute(Void v) {

                String starTotal = null, starAvg = null;
                try {
                    JSONArray jArray = new JSONArray(result);
                    JSONObject json_data = null;
                    for (int i = 0; i < jArray.length(); i++) {
                        json_data = jArray.getJSONObject(i);

                        starTotal = json_data.getString("TotalRating");
                        starAvg = json_data.getString("AverageRating");

                    }
                } catch (JSONException e1) {
                    Log.e("log_tag",
                            "Error in http connection " + e1.toString());
                    Toast.makeText(getActivity(), "JSONexception",
                            Toast.LENGTH_LONG).show();
                } catch (ParseException e1) {
                    e1.printStackTrace();
                }

                int total = 0;

                if (starTotal != null) {
                    total = Integer.parseInt(starTotal);
                } else {
                    starTotal = "0";
                }

                if (total > 0) {
                    total = Integer.parseInt(starTotal);
                } else {
                    total = 0;
                }

                StarTotal = (TextView) getActivity().findViewById(
                        R.id.tvStarTotal);
                StarTotal.setText("(" + String.valueOf(total) + (")"));

                float avg = 0.f;
                try {
                    avg = Float.parseFloat(starAvg);
                } catch (NumberFormatException e) {
                    avg = 0;
                }

                DecimalFormat myFormat = new DecimalFormat("0.00");
                StarNumbers = (TextView) getActivity().findViewById(
                        R.id.tvStarNumber);
                StarNumbers.setText(myFormat.format(avg));

                ratingsBarTwo.setRating(Float.valueOf(avg));
                progressDialog.dismiss();
            }
        }

首先检查是否有可用的连接,如果没有则通知用户。

特别是如果用户试图中断它(但是,大多数我都设置为不可取消)。

我会重新考虑这个决定。就我个人而言,我不喜欢不可中断的过程。我的建议是你继续按照@CommonsWare 在评论中的建议进行操作here。很快,有一个布尔变量来检查数据是否无效,或者您自己检查数据是否为空。如果是,请不要执行基于此数据的任何命令,并且您不会有任何与此相关的强制关闭。

有没有比我下面更好的方法来处理这个问题?

除了上面所述之外,我建议向您的 http 客户端添加一些 HTTP 参数。例如:

final int CONN_WAIT_TIME = 3000;
final int CONN_DATA_WAIT_TIME = 2000;

HttpParams httpParams = new BasicHttpParams();      
HttpConnectionParams.setConnectionTimeout(httpParams, CONN_WAIT_TIME);
HttpConnectionParams.setSoTimeout(httpParams, CONN_DATA_WAIT_TIME);

DefaultHttpClient postClient = new DefaultHttpClient(httpParams);

// Go on...

如果你的http客户端超过了你在各自字段中输入的时间,它只会给你一个ConnectTimeoutException。现在您已经了解了足够的信息来考虑数据是否有效onPostExecute()以及您是否应该继续使用它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何处理 Java/Android 中的慢速网络连接 的相关文章

随机推荐

  • Zend Framework TDG 与 Doctrine [重复]

    这个问题在这里已经有答案了 可能的重复 什么时候应该使用 ORM 主义 什么时候应该使用 zend db table 简而言之 什么更好 为什么 我目前使用 Zend Framework TDG 但正在考虑转向 Doctrine 已经从 Z
  • 具有显式域的本地主机上的 Cookie

    我一定是错过了一些关于 cookie 的基本知识 在本地主机上 当我在服务器端设置 cookie 时and将域显式指定为 localhost 或 localhost 某些浏览器似乎不接受cookie 火狐 3 5 我在 Firebug 中检
  • 适用于 Windows 的最佳轻量级 Web 服务器(仅静态内容)[关闭]

    Closed 这个问题是无关 目前不接受答案 我在 Windows 中运行应用程序服务器 IIS6 0 并使用 Zend Server 来执行 PHP 我正在同一台计算机上寻找轻量级仅静态内容的 Web 服务器 它将重温 IIS 表单处理静
  • “类型错误:‘函数’对象不支持项目分配”

    我有两个矩阵 fi f1 Nij N11 N12 N1n f2 N21 N22 N2n fn Nn1 Nn2 Nnn 我想乘以 f1 to each element of the 1st row f2 to each element of
  • ListView光标变化和闪烁

    当光标出现在某个项目上时 我试图更改标准 ListView 上出现的光标 然而 当鼠标变为手指光标 然后又回到我要求的状态时 我得到了闪烁的效果 我试图将这种闪烁 更改隔离到手形光标 但无法弄清楚它发生在哪里或如何阻止它 为了复制这个 1
  • 如何启用 WCF 日志记录以便将其写入数据库?

    我希望能够在数据库中记录消息信息 并且我正在尝试决定如何最好地做到这一点 是否可以将 WCF 日志记录机制配置为写入数据库而不是文件 谢谢 你需要有两件事 启用 NET 跟踪的正确配置 跟踪侦听器 用于捕获跟踪消息并将其存储在数据库中 Fo
  • 实体框架 6 提供开箱即用的存储库和 UoW

    但如何使用它呢 我有一个Code First项目建立 并尝试使用这个新的 EF6 进行一些操作 阅读至少 2 岁有关 EF4 5 的各种帖子 博客 但对于 EF6 却一无所知 假设我有这些实体 public DbSet
  • 基于注释的验证框架[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我正在寻找一个基于注释的验
  • PHP HTML 创建库 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我正在寻找一个 PHP 解
  • 这里的递归是如何工作的?

    Code 1 public static int fibonacci int n if n 0 n 1 return 1 else return fibonacci n 1 fibonacci n 2 你如何使用fibonacci如果你还没
  • 如何在 OS X 上安装 Hudson 作为服务?

    Running hudson这很简单 但目前文档缺少在 OS X 上安装正在运行的 hudson 作为守护进程 服务的教程 当您切换到生产时 您需要确保其配置正确并受到保护 要求 能够在端口 80 上运行它 不以 root 身份运行 或者至
  • android.net 与 java.net 以及不同的 URI 类

    我正在编写一个带有模型对象的应用程序 该对象将向某些 Web 服务公开 Restful 接口 我注意到 Android 中有一个 java net URI 和一个 android net URI 类 使用其中一种与另一种相比有什么好处 有没
  • 在 django 过滤器中使用 dateadd

    我有一个按开始日期和持续时间 以天为单位 定义订阅期的模型 class SubscriptionProduct models Model start date models DateField duration models Integer
  • 可以包装或合并单独的名称空间吗?

    我似乎记得在某处看到过关于将多个命名空间合并为一个的方法的注释 现在 在寻找所说的笔记时 我找不到它们 即使使用搜索词组合 分组 合并和包装进行搜索 我也没有找到任何结果 也许我误解了我之前所看到的 我对此没有具体的应用程序 这只是出于好奇
  • Blazor 监听 javascript 事件

    我有一个名为 Hello 的 JavaScript 事件 addEventListener hello function alert event listener 并且 在另一个 javascript 函数中 我引发了该事件 let eve
  • 使用 MongoTemplate 进行 Spring Boot

    我是 Spring Boot 和 MongoDb 的新手 尝试使用 Mongo 存储库和 Spring Boot 的一些示例 但在浏览了一些文档后发现 Mongo Template 将是一个更好的选择 无法使用 Mongo 模板示例获取正确
  • WF4 RC - 使用 ActivityXamlServices 从松散 Xaml 加载 WF 服务时无法创建未知类型

    我正在尝试动态托管 WF4 RC 服务 我有一个包含两个项目的测试解决方案 第一个是声明性工作流服务库 其中包含一个根 Flowchart 活动和一个简单的自定义代码活动 工作流服务库不依赖于任何其他自定义程序集或引用 第二个是我的主机应用
  • 访问基本过滤器 Play Framework 2 中的请求正文

    我是斯卡拉新手 正如play框架官方文档中提到的https www playframework com documentation 2 3 x ScalaHttpFilters Play 提供了一个名为 EssentialFilter 的较
  • 构造函数可以是异步的吗?

    我有一个项目 我试图在构造函数中填充一些数据 public class ViewModel public ObservableCollection
  • 如何处理 Java/Android 中的慢速网络连接

    我有一个应用程序需要多次调用 MySQL 数据库 它在一个AsyncTask 下面是一个可能看起来像的示例 我的主要问题是这样的 有时 主机 Godaddy 呃 决定停止连接 而我的progressDialog加载 加载 加载更多 直到强行