【问题标题】:Android TextView "append" does NOT update after each loop. How to solve this?Android TextView“追加”不会在每次循环后更新。如何解决这个问题?
【发布时间】:2015-01-25 13:45:30
【问题描述】:

请像教业余爱好者一样回答。 我看到了一些答案,但不幸的是我不明白在哪里插入代码。 这是我的代码。每次 for 循环运行时,如何使这个“results1”TextView 更新? 目前,输出仅在循环结束时显示。 请记住,我是初学者。所以,请澄清。

我有一个

public class MainActivity extends Activity {
    LinearLayout layout1; 
    //One text view, buttons and EditText fields 
}

那么,我有;

 private OnClickListener test = new OnClickListener() {
    @Override
    public void onClick (View V)
    {
        results1.setText("Done");
        results1.append("\n");

        try {
            for(int k=x[1];k<=x1[1];k++) {
                //Bunch of code

                BufferedReader reader = new BufferedReader(new InputStreamReader(
                        process.getInputStream()));

                int j;
                char[] buffer = new char[4096];
                StringBuffer output = new StringBuffer();
                while ((j = reader.read(buffer)) > 0)
                    output.append(buffer, 0, j);
                reader.close();

                str = output.toString();
                Log.d("1:str", str);
                results1.setTextAppearance(getApplicationContext(), 0);
                results1.setTextSize(14);
                results1.setBackgroundColor(Color.rgb(234,234,234));
                results1.setTextColor(Color.parseColor("#00BFFF"));
                results1.append(str);
                results1.append("\n");
                //results1.setTextIsSelectable(true);

            }

        } catch (ArrayIndexOutOfBoundsException e) {
            results1.append(str1);
            System.err.println("ArrayIndexOutOfBoundsException: " + e.getMessage());
        } 
    }
 }; 
 }

【问题讨论】:

    标签: android android-edittext textview append buffer


    【解决方案1】:

    在主 UI 线程中运行此类代码不是一个好主意,可能会导致线程挂起。您应该使用AsyncTask 来运行您的繁重处理。当您想要更新 UI 时,可以使用 onProgressUpdate() 方法。

    【讨论】:

    • 嗨,如果你有空,你能帮忙重组这段代码吗?我从来没有做过多线程。
    • 请使用我上面的代码作为示例...我正在查看网络上的其他示例以更好地理解,但似乎无法掌握它。谢谢。
    【解决方案2】:

    像这样写一个异步类

    public class ReadStreamTask extends AsyncTask<String,Integer,String> {
    
        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
             results1.setText("Done");
             results1.append("\n");
        }
    
        @Override
        protected String doInBackground(String... link) {
            // TODO Auto-generated method stub
    
    
            try {
    
                BufferedReader reader = new BufferedReader(new InputStreamReader(
                        process.getInputStream()));
    
                int j;
                char[] buffer = new char[4096];
                StringBuffer output = new StringBuffer();
                while ((j = reader.read(buffer)) > 0)
                    output.append(buffer, 0, j);
                reader.close();
    
               // str += output.toString();
    
                return output.toString();
            } catch (Exception e) {
                e.printStackTrace();
                return output.toString();
            }
    
        }
    
        @Override
        protected void onPostExecute(String result) {
            results1.setText(result);
        }
    }
    

    然后调用那个类

    new ReadStreamTask.execute();
    

    asynctask中的三个参数(如果我没记错的话)

    • 第一个:如果你想将值传递给异步类(ex String(your url)
    • 2nd:传递给异步类的值,通常是在后台任务发生进度时使用的整数。它的值用于增加进度,但很少使用。
    • 第三点:最重要的是异步类的返回类型

    【讨论】:

    【解决方案3】:

    如果你想在每次 for 循环运行时更新这个“results1”TextView, 您可以将以下 AsyncTask 作为您的内部类并调用

    [YOUR_VIEW].setOnClickListener(new View.OnClickListener() {
    
                @Override
                public void onClick(View arg0) {
                    new ReadTask().execute();
                }
    });
    

    ReadTask.java

    public class ReadTask extends AsyncTask<Void, String, Void>{
            BufferedReader reader = null;
            @Override
            protected void onPreExecute() {
                results1.setText("Done");
                results1.append("\n");
                super.onPreExecute();
            }
    
            @Override
            protected Void doInBackground(Void... params) {
                try {
                      for(int k=x[1];k<=x1[1];k++) {
                        //Bunch of code
    
                        reader = new BufferedReader(new InputStreamReader(
                                process.getInputStream()));
    
                        int j;
                        char[] buffer = new char[4096];
                        StringBuffer output = new StringBuffer();
                        while ((j = reader.read(buffer)) > 0)
                            output.append(buffer, 0, j);
                        reader.close();
    
                        str = output.toString();
                        Log.d("1:str", str);
                        publishProgress(str);
    
                        //Sleeping for a second
                        try {
                            Thread.sleep(1000);         
                        } catch (InterruptedException e) {
                           e.printStackTrace();
                        }
                        //results1.setTextIsSelectable(true);
    
                    }
    
                } catch (ArrayIndexOutOfBoundsException e) {
                    results1.append(str);
                    System.err.println("ArrayIndexOutOfBoundsException: " + e.getMessage());
                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }  finally {
                    try {
    
                        if (reader != null) {
    
                            reader.close();
                        }
    
                    } catch (IOException ex) {
    
                        ex.printStackTrace();
    
                    }
                }
                return null;
            }
    
            @Override
            protected void onProgressUpdate(String... values) {
                results1.setTextAppearance(getApplicationContext(), 0);
                results1.setTextSize(14);
                results1.setBackgroundColor(Color.rgb(234,234,234));
                results1.setTextColor(Color.parseColor("#00BFFF"));
                results1.append(str);
                results1.append("\n");
                super.onProgressUpdate(values);
            }
    
        }
    

    请检查这是否对您有帮助。

    【讨论】:

    • 非常感谢!有用。 1)可以有多个公共课程? (在这种情况下,MainActivity 和 ReadTask?)这对我来说是新的。 2)在我的logCat中,我不断收到一条消息(TID:522,标签:包裹,文本:读取此处不支持的NULL字符串)-这是什么意思?
    • 另外,请告诉我让它休眠1秒的目的是什么?这是否意味着我们每隔一秒将“str”的输出发送到发布进度? (但是,在我的应用程序上,它不是 1 秒,每次循环结束时都会输出),那么 1 秒睡眠的目的是什么?请解释。再次感谢。
    • 另外,我在 MainActivity 上有一个取消按钮。当用户按下取消按钮时如何停止这个 AsyncTask?
    • 我延迟 1 秒向您展示 TEXTVIEW 的更新方式。就是这样!
    • 我们需要实现两件事来停止或取消 AsyncTask 的执行。 1. 调用AsyncTask 的cancel() 方法从你想停止执行的地方,可能基于按钮点击。 if([YOUR_ASYNC_TASK].getStatus() == Status.RUNNING){ [YOUR_ASYNC_TASK].cancel(true); 2.通过doInBackground方法中的isCancelled()方法检查AsyncTask是否被取消。 protected Object doInBackground(Object... x) { while (/* condition */) { ... if (isCancelled()) break; } 返回空值; }
    猜你喜欢
    • 1970-01-01
    • 2020-01-18
    • 2019-02-23
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多