【问题标题】:Method setProgress must be called from the UI Thread?方法 setProgress 必须从 UI 线程调用?
【发布时间】:2017-02-02 13:31:58
【问题描述】:

我正在尝试通过 AsyncTask 设置进度条。但我有一个小问题。

我的代码在这里;

    public  class DownloadFileFromURL extends AsyncTask<String, String, String> {


    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        mBuilder.setProgress(100, 0, false);
        mNotifyManager.notify(id, mBuilder.build());
    }


    @Override
    protected String doInBackground(String... f_url) {


        try {
            //CreateDownloadTransactionInPanel(1);
            long total = 0;
            URL url = new URL(f_url[0]);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();

            if(file.exists()){
                //6829809
                deneme = file.length();
                connection.setRequestProperty("Range", "bytes="+(file.length())+"-"); // indirmemiÅŸse atamaz

            }

            connection.connect();
            RandomAccessFile output = new RandomAccessFile(file,"rw");
            BufferedInputStream input = new BufferedInputStream(connection.getInputStream());

            if (file.length() > 0) {
                output.seek(deneme);
                total=deneme;

            }

            byte data[] = new byte[4096];
            int lastcount = 0;


            while ((count = input.read(data,0,4096)) != -1) {

                if (isCanceled) {
                    downloadresult = false;
                    break;
                }

                if (intCheck()) {
                    total += count;
                    downloadresult = true;
                    ProgBarCount = (int) ((total * 100) / lenghtOfFile);
                    if (ProgBarCount > lastcount) {
                        lastcount = ProgBarCount;
                        publishProgress(Integer.toString(ProgBarCount));
                        pBar.setProgress(ProgBarCount);

                    }
                    output.write(data, 0, count);
                }
                else {
                    downloadresult = false;
                    break;
                }


            } //--While Son--

            output.close();
            input.close();
        }

        catch (Exception e) {
            e.printStackTrace();
            exmessage = e.getMessage().toString();
            downloadresult = false;
        }
        return null;
    } // doinBackSON


    /**
     * Updating progress bar
     */
    protected void onProgressUpdate(String... progress) {
        // setting progress percentage

        mBuilder.setProgress(100, Integer.parseInt(progress[0]), false);
        mBuilder.setContentText("Şuan İşlemde : %" + Integer.parseInt(progress[0]) + "");
        mNotifyManager.notify(id, mBuilder.build());
        super.onProgressUpdate(progress);

    }

    @Override
    protected void onPostExecute(String downloadpath) {

        if (exmessage != null) {
            Toast.makeText(getApplicationContext(),"hata:"+exmessage, Toast.LENGTH_SHORT).show();
        }

        if (downloadresult == true) {

            if (file.exists() && lenghtOfFile == (int) file.length()) {

                Toast.makeText(DownloadActivity.this, "DOSYA INDIRILDI VE YUKLEMEYE HAZIR", Toast.LENGTH_SHORT).show();

            } else {

                Toast.makeText(getApplicationContext(), "DOSYA YOK YADA EKSIK INDIRILDI", Toast.LENGTH_SHORT).show();
            }
            CreateDownloadTransactionInPanel(2);
            scheduleNotificationWithTickButton(); // Tick Button
            RedirectRebootActivity(); // Burda hata olabilir


        } //--True Son


        else // False Başlangıç

        {
            mNotifyManager.cancel(2219);

            //scheduleNotificationWithResumeButton(); Devam button

        }

    }


}

Android studio 说:setProgress 方法必须从 UI 线程调用。

这一行pBar.setProgress(ProgBarCount);

有可能吗? , 你对此有任何想法吗?

谢谢!

【问题讨论】:

    标签: java android multithreading android-asynctask


    【解决方案1】:

    你拨打PublishProgress

    这会触发对 AsyncTask 中的 onProgressUpdate 方法的调用

    @Override
    protected void onProgressUpdate(Integer... progress) {
         setProgressPercent(progress[0]);
     }
    

    用这个方法进行 UI 操作

    【讨论】:

      【解决方案2】:
      @Overide
      protected void onProgressUpdate(Integer... progress) {
           setProgressPercent(progress[0]);
       }
      

      你可以用这个

      【讨论】:

      • 我已经接受的答案的重复。我猜你也对我的投了反对票?
      • 真的很抱歉,我一次打开了多个问题,我正在回答其他问题,显然页面没有刷新,所以看不到你的答案。另外,没有人故意发布相同的答案,所以要成熟一点,停止哭泣,停止对别人的回答投反对票,没有人故意这样做
      • 我没有否决任何答案,也没有哭泣。只以为是您,因为在您发布答案的确切时间投反对票。顺便说一句,页面会自动更新,因此您可以查看是否已经发布了答案。如果您在未立即回答问题的情况下留下问题,您可能需要在将来刷新页面以避免添加噪音。您回答的最后一个问题是在此问题之前 45 分钟。
      • 再看一次哭泣的单票,请到上面来,此外,我认为您是一名编码员,要分析一些问题,您需要在IDE中设置代码并尝试测试相同的问题,然后可以解决,做同样的事情,那就是你花了一些时间,因为问题没有解决,目前还回答了一个问题,我可能必须生成一个完整的布局,抱歉,但创建一个布局不需要对我来说至少 5 分钟或 10 分钟。另外,为了您的清楚,我没有投反对票,我现在可能
      • 另外,为了更清楚起见,页面会自动刷新但不显示答案,它只显示带有标签“1 answer”的水平分隔线并且不显示整个答案,但是这也没有为我弹出,可能是我的浏览器有问题,那是我的错,我很抱歉,但这是无意的。此外,这样的事情发生了,即使我的许多答案都与人们在我之后给出的相同答案相同,这并不意味着我也会对他们投反对票,一些解决方案有共同的答案,你或我对此无能为力
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多