【问题标题】:Android asynctask not finishing its processAndroid asynctask 未完成其进程
【发布时间】:2016-03-08 13:02:11
【问题描述】:

我使用异步任务将用户数据上传到服务器,但是当我单击按钮时,进度对话框仍然显示很长时间,我在 Asynctask 的 OnpostExecute() 方法中使用了 dialog.cancel,但它不起作用

异步任务代码:

private class Userdataupload2 extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String[] params) {
        // do above Server call here


        String s = "eroor";

                HttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost("http://www.webdev1.comxa.com/sciencequiz/user.php");


                int mode = Activity.MODE_PRIVATE;
                SharedPreferences my2 = getSharedPreferences("fb", mode);
                String u = my2.getString("name", "error");
                String v = my2.getString("coin", "error");
                String ax = my2.getString("android_id", "error");
                String bx = my2.getString("device_model", "error");
                String cx = my2.getString("android_version", "error");
                String dx = my2.getString("cpu_info", "error");
                String ex = my2.getString("mem_info", "error");
                String fx = my2.getString("device_manufacturer", "error");

                List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>(2);
                nameValuePair.add(new BasicNameValuePair("name", u));
                nameValuePair.add(new BasicNameValuePair("coin", v));
                nameValuePair.add(new BasicNameValuePair("androidId", ax));
                nameValuePair.add(new BasicNameValuePair("deviceModel", bx));
                nameValuePair.add(new BasicNameValuePair("androidVersion", cx));
                nameValuePair.add(new BasicNameValuePair("cpuInfo", dx));
                nameValuePair.add(new BasicNameValuePair("memInfo", ex));
                nameValuePair.add(new BasicNameValuePair("deviceManufacturer", fx));

                try {
                    httpPost.setEntity(new UrlEncodedFormEntity(nameValuePair));

                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                    //cancel(true);
                }

                try {
                    HttpResponse response = httpClient.execute(httpPost);
                    // write response to log
                    //tdt(response.toString());
                    Log.d("Http Post Response:", response.toString());

                    s = response.toString();
                } catch (ClientProtocolException e) {
                    // Log exception
                    //cancel(true);
                    e.printStackTrace();
                } catch (IOException e) {
                    // Log exception
                    //cancel(true);
                    e.printStackTrace();
                }
        return s;
    }


    @Override
    protected void onPostExecute(String message) {
        //process message

        int mode = Activity.MODE_PRIVATE;
        SharedPreferences data = getSharedPreferences("data", mode);
        SharedPreferences.Editor e = data.edit();
        e.putInt("aa",1);
        e.commit();
        dialog.cancel();
        goToActivity(onlineranking.class);
    }
    @Override
    public void onPreExecute()
    {

    }
}

在按钮点击功能中:

new Thread(new Runnable() {
            public void run() {

                try {
                    new Userdataupload2().get(10000,TimeUnit.MILLISECONDS);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (ExecutionException e) {
                    e.printStackTrace();
                } catch (TimeoutException e) {
                    e.printStackTrace();
                    dialog.cancel();
                }
            }
            }).start();

我使用了新的Userdataupload2().get(10000,TimeUnit.MILLISECONDS);,因为如果没有互联网连接,任务会停止 10 秒,

我在stackoverflow中尝试了很多例子,但都是在下载数据的情况下,但我想发布/上传数据 如何解决这个问题?


编辑:
我不仅要在一段时间后取消进度对话框,而且只有在成功发布数据后才应关闭或取消进度对话框

【问题讨论】:

  • 日志告诉你什么?你开始你的新话题了吗?

标签: android android-asynctask


【解决方案1】:

看起来你还没有在按钮点击中开始你的线程。您的代码中缺少start()

new Thread(new Runnable() {
        public void run() {

            try {
                new Userdataupload2().get(10000,TimeUnit.MILLISECONDS);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            } catch (TimeoutException e) {
                e.printStackTrace();
                dialog.cancel();
            }
        }
        }).start();

【讨论】:

  • 我试过你的代码,现在 get() 方法中的超时 10s 有效,但服务器没有任何反应,没有数据发布到服务器,我认为我发布数据的代码是正确的
  • 我还通过将超时时间从 10 秒更改为 60 秒来测试我的代码,现在进度对话框显示到 60 秒,然后消失,但是对于发布大约 2KB 的数据,不到 20 秒就足够了
【解决方案2】:

尝试dialog.dismiss() 而不是dialog.cancel()

@Override
    protected void onPostExecute(String message) {
        //process message

        int mode = Activity.MODE_PRIVATE;
        SharedPreferences data = getSharedPreferences("data", mode);
        SharedPreferences.Editor e = data.edit();
        e.putInt("aa",1);
        e.commit();
        dialog.dismiss();
        goToActivity(onlineranking.class);
    }

【讨论】:

    【解决方案3】:

    可能是您在单独的线程中处理此问题的原因。我认为没有必要在按钮点击中创建一个新线程。只需删除那个新线程(new Runnable...., 并在不创建新线程的情况下编写代码。 就像
    试试 {

    new Userdataupload2().get(10000,TimeUnit.MILLISECONDS);

    }

    catch (InterruptedException e) {

    e.printStackTrace();

    }

    catch (ExecutionException e) {

    e.printStackTrace();

    }

    catch (TimeoutException e) {

    e.printStackTrace();

    dialog.cancel();

    }

    【讨论】:

    • 我创建了一个新线程来调用 asynctask 以避免在使用 'get()' 时阻塞 ui 线程
    猜你喜欢
    • 2015-04-20
    • 2020-12-16
    • 1970-01-01
    • 2023-04-05
    • 2016-07-28
    • 2016-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多