Java 当我按下激活片段中asynctask的按钮时,应用程序停止工作

Java 当我按下激活片段中asynctask的按钮时,应用程序停止工作,java,android,android-asynctask,Java,Android,Android Asynctask,我在我的应用程序中打开了一个新的片段,我想计算价格并在每过一秒(通过asyncTask)打印它,但是当我运行应用程序时,它就停止工作了。 你能帮我找到问题吗 public class RandomDrive extends Fragment { private Chronometer chronometer; private Button start; private Button stop; private TextView price; @Nullable @Override public

我在我的应用程序中打开了一个新的片段,我想计算价格并在每过一秒(通过asyncTask)打印它,但是当我运行应用程序时,它就停止工作了。 你能帮我找到问题吗

public class RandomDrive extends Fragment {
private Chronometer chronometer;
private Button start;
private Button stop;
private TextView price;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_random_drive, container, false);
    chronometer = (Chronometer) v.findViewById(R.id.chronometer);
    price = v.findViewById(R.id.see_price);
    class SyncTaskCounter extends AsyncTask<Void, Void, Void> {
        @Override
        protected Void doInBackground(Void... voids) {
            double price = 0;

            while (!isCancelled()) {
                price = price + 0.05;
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                printPrice(price);
            }
            return null;
        }
        @Override
        protected void onCancelled() {
            super.onCancelled();
        }
    }
    final SyncTaskCounter asyncTaskCount;
    asyncTaskCount = new SyncTaskCounter();
    start = (Button) v.findViewById(R.id.start);
    start.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            chronometer.setBase(SystemClock.elapsedRealtime());
            chronometer.start();

            asyncTaskCount.execute();
        }
    });
    stop = (Button) v.findViewById(R.id.stop);
    stop.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            chronometer.stop();
            asyncTaskCount.cancel(true);

        }
    });
    return v;
}

public void printPrice(double price1) {
    price.setText("the price is: " + price1 + " shekel");

}
}
公共类RandomDrive扩展片段{
私人天文钟;
私人按钮启动;
私人按钮停止;
私有文本视图价格;
@可空
@凌驾
创建视图时的公共视图(@NonNull LayoutInflater inflater、@Nullable ViewGroup container、@Nullable Bundle savedInstanceState){
视图v=充气机。充气(R.layout.fragment\u random\u驱动器,容器,错误);
天文钟=(天文钟)v.findviewbyd(R.id.天文钟);
价格=v.findviewbyd(R.id.见价格);
类SyncTaskCounter扩展了AsyncTask{
@凌驾
受保护的空位背景(空位…空位){
双倍价格=0;
而(!isCancelled()){
价格=价格+0.05;
试一试{
睡眠(1000);
}捕捉(中断异常e){
e、 printStackTrace();
}
印刷价格;
}
返回null;
}
@凌驾
受保护的void onCancelled(){
super.onCancelled();
}
}
最终SyncTaskCounter asyncTaskCount;
asyncTaskCount=新的SyncTaskCounter();
开始=(按钮)v.findViewById(R.id.start);
start.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
天文钟.setBase(SystemClock.elapsedRealtime());
计时表。开始();
asyncTaskCount.execute();
}
});
停止=(按钮)v.findViewById(R.id.stop);
stop.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
计时器。停止();
asyncTaskCount.cancel(true);
}
});
返回v;
}
公共无效打印价格(双倍价格1){
price.setText(“价格为:“+price1+”谢克尔”);
}
}

问题出在asyncTask中,因为当我在没有asyncTask的情况下运行函数并仅在最后计算价格时——应用程序运行。

在Android上,您必须在UI线程上运行所有UI代码。AsyncTask中的代码在其他线程中执行,因此无法调用UI方法

为此,应使用处理程序(代码将在UI线程中调用):

如果您必须使用AsyncTask,那么您应该从方法onProgressUpdate更新UI

类SyncTaskCounter扩展了AsyncTask{
@凌驾
受保护的空位背景(空位…空位){
双倍价格=0;
而(!isCancelled()){
价格=价格+0.05;
试一试{
睡眠(1000);
}捕捉(中断异常e){
e、 printStackTrace();
}
publishProgress(price);//这指示从UI线程调用onProgressUpdate。
}
返回null;
}
@凌驾
受保护的void onProgressUpdate(双倍…价格){
printPrice(price[0]);//这是在UI线程上调用的
}
@凌驾
受保护的void onCancelled(){
super.onCancelled();
}
}

非常有用!tnx!!
final Handler h=new Handler();
h.postDelayed(new Runnable() {
   public void run() {
      printPrice(price);
      price = price + 0.05;
      h.postDelayed(this, 1000); // call for next update
   }
}, 1000);
class SyncTaskCounter extends AsyncTask<Void, Double, Void> {
        @Override
        protected Void doInBackground(Void... voids) {
            double price = 0;

            while (!isCancelled()) {
                price = price + 0.05;
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                publishProgress(price); // this instructs to call onProgressUpdate from UI thread.
            }
            return null;
        }
        @Override
        protected void onProgressUpdate(Double... price) {
                printPrice(price[0]);  // this is called on UI thread
        }

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