【问题标题】:AsyncTask Android Unable To Update Progress RingAsyncTask Android 无法更新进度环
【发布时间】:2016-05-05 14:30:05
【问题描述】:

我写了一个asynctask来处理json,json结果很长(2G上需要40-70秒处理)。asynctask publishProgress("");函数仅在获取和处理 json 之后(就在 postexecute() 之前)执行。如何每秒更新一次。

    class LoadAllProducts extends AsyncTask<String, String, String> {
        int per=100;
        @Override
        protected void onPreExecute()
        {
            super.onPreExecute();
            clear();
            pDialog = new ProgressDialog(Load.this);
            pDialog.setMessage("Loading ... Please wait...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();
        }


        protected String doInBackground(String... args) {
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            JSONObject json = jParser.makeHttpRequest(url, "POST", params);
            publishProgress("");
            if(json!=null) {
                try {
                    int success = json.getInt(TAG_SUCCESS);

                    if (success == 1)
                    {
                        products = json.getJSONArray(TAG_PRODUCTS);

                        for (int i = 0; i < products.length(); i++) 
                        {
                            JSONObject c = products.getJSONObject(i);

////////////////////////////////// Other codes
                        }
                    } else {}
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }

            return null;
        }

        protected void onPostExecute(String file_url)
        {
            pDialog.dismiss();      load(0);

        }
        @Override
        protected void onProgressUpdate(String... text)
        {
            per=per-1;
            pDialog.setMessage("Loading Questions... Please wait..."+per);


        }

    }

我参考了:Android, java - Unable to update variable from asynctask

Instance variable of Activity not being set in onPostExecute of AsyncTask or how to return data from AsyncTask to main UI thread

【问题讨论】:

    标签: android


    【解决方案1】:

    使用 AsyncHttpClient 处理有进度的进程

    在您的 .gradle 文件中添加 compile 'com.loopj.android:android-async-http:1.4.6'

    现在创建一个服务类并在你的 androidmanifest.xml 中声明它

    在您的服务类中的 onStartCommand 中的下一步:

        @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.e(TAG, "onStartCommand");
    
        try {
    
            AsyncHttpClient client = new AsyncHttpClient();
            client.setURLEncodingEnabled(true);
    
            client.post(this, url, params, new AsyncHttpResponseHandler() {
                @Override
                public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
    
                      // you code here after the work is done                       
    
                    stopService();
                }
    
                @Override
                public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
    
                    //your code here
                    stopService();
    
                }
    
                @Override
                public void onProgress(int bytesWritten, int totalSize) {
                    super.onProgress(bytesWritten, totalSize);
                    Log.e("Progess", "" + (bytesWritten / totalSize) * 100 + "%");
    
                }
            });
    
    
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    
        return super.onStartCommand(intent, flags, startId);
    }
    

    以及来自您的活动调用

    startService(serviceIntent);
    

    【讨论】:

      【解决方案2】:

      使用publishProgress from doInBackground() 来发布您的进度

      protected Void doInBackground(Integer... params) 
      {
          publishProgress("Loading Questions... Please wait..."+per);
          ...
      }
      

      【讨论】:

      • 这就是我所做的吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多