gpt4 book ai didi

java - 在 Android 中每秒更新一次

转载 作者:行者123 更新时间:2023-11-29 20:35:06 25 4
gpt4 key购买 nike

我正在制作一个根据工资率每秒计数的应用程序,正如现在所写的那样,它在启动时崩溃。

我是不是线程部分做错了?

我是 android 的新手,所以我对一般的 onCreate 方法有点不清楚。对此以及它与我的代码的关系的任何澄清也会有所帮助。

按钮应该开始计数。我认为它因 t.start() 行而崩溃,但我不知道如何触发该事件。

package com.example.terik.myapplication;

import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;


public class MainActivity extends ActionBarActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView text2;
text2 = (TextView) findViewById(R.id.textView2);

Thread t = new Thread() {

@Override
public void run() {
try {
while (!isInterrupted()) {
Thread.sleep(1000);
runOnUiThread(new Runnable() {
@Override
public void run() {
updateTextView();
}
});
}
} catch (InterruptedException e) {
}
}
};

t.start();
}

private void updateTextView() {
TextView text2;
double update;
double rateofPay = 9.00;
text2 = (TextView)findViewById(R.id.textView2);
CharSequence newtime = text2.getText();
int number = Integer.parseInt(newtime.toString());
update = number+ rateofPay;
text2.setText((int) update);

}




@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();

//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}

return super.onOptionsItemSelected(item);
}
}

最佳答案

一个问题是在尝试将 Double 解析为 Integer 时出现 NumberFormatException。

另一个问题是试图在这一行用 int 调用 setText():

text2.setText((int) update);

这修复了它:

private void updateTextView() {
TextView text2;
double update;
double rateofPay = 9.00;
text2 = (TextView)findViewById(R.id.textView2);
CharSequence newtime = text2.getText();
double number = Double.parseDouble(newtime.toString());
update = number+ rateofPay;
text2.setText(String.valueOf(update));
}

编辑:

以下是如何仅在单击按钮时启动线程。首先使 Thread t 成为实例变量,以便在单击按钮时可以访问它 run() 方法(您可能还想重命名该方法!) .

我刚刚测试了这个,它对我有用:

public class MainActivity extends ActionBarActivity {

Thread t;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView text2;
text2 = (TextView) findViewById(R.id.textView2);

t = new Thread() {

@Override
public void run() {
try {
while (!isInterrupted()) {
Thread.sleep(1000);
runOnUiThread(new Runnable() {
@Override
public void run() {
updateTextView();
}
});
}
} catch (InterruptedException e) {
}
}
};

}

public void run(View v) {
t.start();
}

private void updateTextView() {
TextView text2;
double update;
double rateofPay = 9.00;
text2 = (TextView)findViewById(R.id.textView2);
CharSequence newtime = text2.getText();
double number = Double.parseDouble(newtime.toString());
update = number+ rateofPay;
text2.setText(String.valueOf(update));
}

//.........

编辑 2:

正如@BladeCoder 在评论中提到的,Thread 对此实在是太过分了。使用 Handler 和 postDelayed() 确实是解决此类问题的最佳途径。

此外,最好将 TextView 设为实例变量,这样您就不会在每次更新时都创建新的引用。

我也测试了这个版本:

public class MainActivity extends ActionBarActivity {

TextView text2;
Handler handler;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

text2 = (TextView) findViewById(R.id.textView2);

handler = new Handler();

}

Runnable updateText = new Runnable(){
@Override
public void run(){
updateTextView();
handler.postDelayed(this, 1000);
}
};

public void run(View v) {
handler.postDelayed(updateText, 1000);
}

private void updateTextView() {

double update;
double rateofPay = 9.00;
CharSequence newtime = text2.getText();
double number = Double.parseDouble(newtime.toString());
update = number+ rateofPay;
text2.setText(String.valueOf(update));
}

//.............

关于java - 在 Android 中每秒更新一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31486921/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com