AsyncTask onPreExecute() 中未显示进度条

Posted

技术标签:

【中文标题】AsyncTask onPreExecute() 中未显示进度条【英文标题】:Progress Bar not showing in AsyncTask onPreExecute() 【发布时间】:2014-10-23 05:49:59 【问题描述】:

我目前的项目涉及从服务器下载数据 - 这大约需要 20 秒,所以在此期间我想显示一个进度条,以便用户知道发生了什么。下载任务在 DownloadWebpageTask (AsyncTask) 中执行,我在 preExecute() 中设置了进度条可见性,但它没有显示出来。我已经在这里查看了一大堆问题,但我仍然无法让它发挥作用。如果我不隐藏 onPostExecute() 中的进度条,我可以看到发生了什么——即使我在 onPreExecute() 中设置了 progBar.setVisibility(0),该条实际上直到 doInBackground 之后才显示。我也尝试在 onPreExecute 中设置一个 TextView 以查看它是否只是进度条不起作用,但这也失败了。

请有人帮帮我,我完全被卡住了!!

这调用了我的 AsyncTask:

public void getDTCs(View view) throws URISyntaxException       

        DtcListSingleton.getInstance().setData(null);
        status = "DTC Parsing Not Attempted";
        noDTCs = 0;

        TextView listTitle = (TextView) findViewById(R.id.DTCtitle);
        String newTitle = "Waiting for DTCs";
        listTitle.setText(newTitle);


        String stringURL = "http://192.168.1.129";
        //Check connection
        ConnectivityManager cMgr = (ConnectivityManager)getSystemService(this.CONNECTIVITY_SERVICE);
        NetworkInfo netInf = cMgr.getActiveNetworkInfo();

        // If connected to network carry on with DTC request
        if(netInf != null && netInf.isConnected())

            //Download the web page as an InputStream
            new DownloadWebpageTask().execute(stringURL);

这是我的 AsyncTask:

private class DownloadWebpageTask extends AsyncTask<String,Void,String>
        @Override 
        protected void onPreExecute()
            super.onPreExecute();
            progBar = (ProgressBar)findViewById(R.id.loadingDTCs);
            progBar.setVisibility(0);
            TextView title = (TextView)findViewById(R.id.DTCtitle);
            title.setText("Loading DTCs");
        
        @Override
        protected String doInBackground(String...urls)
            //params[0] is the url
            try
                return downloadUrl(urls[0]);
            
            catch(IOException e)
                return "Unable to retreieve web page. URL may be invalid.";
             

            // DELETE if overcome client.print delay
            catch (InterruptedException e) 
                e.printStackTrace();
                return "Interrupted Exception from Delaying inputstream"; 
            
        
        @Override
        protected void onPostExecute(String result)

            AlertDialog.Builder resultURL = new AlertDialog.Builder(ActionReadDTCs.this);

            resultURL.setTitle("Result of DownloadWebPageTask")
            .setMessage(result)

            .setPositiveButton("OK", new DialogInterface.OnClickListener()
                public void onClick(DialogInterface dialog, int id)
                    progBar = (ProgressBar)findViewById(R.id.loadingDTCs);
                    progBar.setVisibility(8);
                    return;
                
            )

            .show();
        
    

【问题讨论】:

你用 .setVisibility(View.VISIBLE) 试过了吗 您的最小/最大 SDK 和当前版本的 android 版本? 它会改变文本吗? title.setText("加载 DTC");?? 是的,我用 View.VISIBLE 试过了,还是同样的问题。它也没有显示文字。 其实我想知道...在我的 AsyncTask 中,我正在调用其他几个任务,例如 downloadUlr 等 - 这些都需要在 AsyncTask 中声明吗? 【参考方案1】:

示例代码看看这是否有效?如果这有效,则意味着您在显示和隐藏视图时犯了一些错误

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_
   android:layout_
   android:orientation="vertical" >
    <Button
       android:id="@+id/btnDownload"
       android:layout_
       android:layout_
       android:layout_gravity="center"
       android:text="@string/download"
       android:textSize="14sp" />
    <ImageView
       android:id="@+id/imageView"
       android:layout_
       android:layout_
       android:contentDescription="@string/your_image_will_appear_here" />
</LinearLayout>

还有你的 java 类

private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> 
    /** Reference to the view which should receive the image */
    private final WeakReference imageRef;public DownloadImageTask(ImageView imageView) 
        imageRef = new WeakReference(imageView);
    

    @Override
    protected void onPreExecute() 
        super.onPreExecute();
        progressDialog = ProgressDialog.show(DownloadImageActivity.this, "Wait", "Downloading...");
    

    @Override
    protected Bitmap doInBackground(String... params) 
        InputStream input = null;
        try 
            URL url = new URL(params[0]);
            // We open the connection
            URLConnection conection = url.openConnection();
            conection.connect();
            input = new BufferedInputStream(url.openStream(), 8192);
            // we convert the inputStream into bitmap
            bitmap = BitmapFactory.decodeStream(input);
            input.close();
         catch (Exception e) 
            Log.e("Error: ", e.getMessage());
        
        return bitmap;
    

    /**
    * After completing background task Dismiss the progress dialog
    * **/
    protected void onPostExecute(Bitmap bitmap) 
        progressDialog.dismiss();
        if (isCancelled()) 
            bitmap = null;
        

        if (imageRef != null) 
            ImageView imageView = imageRef.get();
            if (imageView != null &amp;&amp; bitmap != null) 
                imageView.setImageBitmap(bitmap);
             else
                Toast.makeText(DownloadImageActivity.this, "Error while downloading the image!", Toast.LENGTH_LONG).show();
        
    




<uses-permission android:name="android.permission.INTERNET"/>

See the result

【讨论】:

【参考方案2】:

感谢您的回复,但我已经找到了我的问题。

我还没有发布我的所有代码 - 我实际上是在 AsyncTask 之后调用另一个函数,一旦我将 new DownloadWebpageTask.execute(String url) 之后的所有代码移动到 onPostExecute() 中,我的进度条就显示出来了!

【讨论】:

以上是关于AsyncTask onPreExecute() 中未显示进度条的主要内容,如果未能解决你的问题,请参考以下文章

onPreExecute() 和 onPostExecute() 是在 UI 线程还是在启动 AsyncTask 的线程上执行?

AsyncTask onPreExecute() 中未显示进度条

从片段调用 Android AsyncTask 没有调用其成员 - doInbackground、onpreexecute、onpostexecute

异步任务;调用方法 onPreExecute() 后未调用 doInbackground()

AsyncTask

解析JS (Gson)