我如何使用TextView修复AzyncTask错误

问题描述 投票:0回答:2

我想在我的TextView中显示一个从1到100的计时器,但这会引发异常。我的应用程序抛出RuntimeException,如下所示:

感谢您的帮助。

java.lang.RuntimeException:执行时发生错误doInBackground()

我抛出RuntimeException的MainActivity类。

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView txt = findViewById(R.id.txt);
        Button button1 = findViewById(R.id.bt1);
        Button button2 = findViewById(R.id.bt2);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new QQ().execute();
            }
        });
    }


    public void onProgressUpdate(int i) {
        TextView txt = findViewById(R.id.txt);
        Button button1 = findViewById(R.id.bt1);
        Button button2 = findViewById(R.id.bt2);
        txt.setText(i);
    }

    private class QQ extends AsyncTask<Integer, Integer, Integer> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        protected Integer doInBackground(Integer... args) {
            for (int i = 0; i < 1000000; i++) {

                try {
                    Thread.sleep(1000); ///задержка
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                publishProgress(i);
                return null;
            }
            return null;
        }

        private void publishProgress(int i) {
            publishProgressq(i);
        }

        protected void onPostExecute(int i) {

        }
    }

    private void publishProgressq(int i) {
        onProgressUpdate(i);
    }
}

我的xml中的布局类

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#bbbbbb"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#bbbbbb"
        android:gravity="top"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/txt"
            android:layout_width="151dp"
            android:layout_height="110dp"
            android:textSize="45dp"
            android:text="0">
        </TextView>
        <Button

            android:id="@+id/bt1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="onClick"
            android:text="START" />

        <Button
            android:id="@+id/bt2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="onClick"
            android:text="STOP" />
    </LinearLayout>
</LinearLayout>
java android
2个回答
1
投票

您可以如下更改代码:

public void onProgressUpdate(int i) {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            TextView txt = findViewById(R.id.txt);
            Button button1 = findViewById(R.id.bt1);
            Button button2 = findViewById(R.id.bt2);
            txt.setText(i);
        }
    });
}

它将在主线程上运行。


1
投票

在您的公共空白onProgressUpdate内,设置这样的文本:

txt.setText(String.valueOf(i));

如果将TextView设置为int,它将被解释为Android资源ID。如果希望将int的值作为文本(而不是它指向的资源)作为文本,请首先将其设置为String。

© www.soinside.com 2019 - 2024. All rights reserved.