更新Android

时间:2015-07-18 01:37:11

标签: java android

我正在创建一个根据付费率每秒计算一次的应用程序,并且正如现在编写的那样,它会在启动时崩溃。

我的线程部分错了吗?

我对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);
    }
}

2 个答案:

答案 0 :(得分:2)

尝试将Double解析为整数时,一个问题是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));
}

修改:

以下是单击Button时仅启动Thread的方法。首先使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一样,一个线程真的过度杀戮了。使用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));
    }

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

答案 1 :(得分:0)

使用"整洁的方式"而不是使用线程实现这一点,你可以实现相同的效果。使用Timer类。

检查此stackoverflow回答Android timer? How-to?

关于onCreate方法,我建议您检查活动生命周期

  

首次创建活动时调用。这是您应该执行所有常规静态设置的地方:创建视图,将数据绑定到列表等。此方法还为您提供包含活动的先前冻结状态的Bundle(如果有)。   始终紧跟onStart()。

查看文档以获取更多信息http://developer.android.com/reference/android/app/Activity.html#onCreate(android.os.Bundle)