NullPointerException Проблема с представлением - PullRequest
0 голосов
/ 17 июня 2011

Я думаю, что есть кое-что, что я пока не понимаю, как эти представления должны быть закодированы.Это третий раз, когда я приходил и отвечал на вопрос о них за последние 3 дня!: S

В любом случае, моя проблема заключается в следующем.

edit: Этот - это код внутри метода , который выполняется при нажатии кнопки: (Важные точки отмечены)

>>  setContentView(R.layout.stop);
>>  timer = (TextView) findViewById(R.id.timer2);
    GPSMain.button = (Button) findViewById(R.id.stopbutton);

    startService(new Intent(context, Timer.class));

}

Это класс Timer, который выполняется в вызове "startService": (Снова отмечаются важные точки)

public class Timer extends Service {

static int totalSeconds = 0;
private int hour = 0;
private int min = 0;
private int sec = 0;
String mTimeFormat = "%02d:%02d:%02d";
final private Handler mHandler = new Handler();
static String timeTaken;
Context context = this;

Runnable mUpdateTime = new Runnable() {
    public void run() { updateTimeView(); }
};

@Override
public void onCreate() {

    Toast.makeText(context, "Timer Started", Toast.LENGTH_LONG).show();

    mHandler.postDelayed(mUpdateTime, 1000);
}

public void updateTimeView() {
    totalSeconds += 1;
    sec += 1;
    if(sec >= 60) {
        sec = 0;
        min += 1;
        if (min >= 60) {
            min = 0;
            hour += 1;
        }
    }
>>  timeTaken = String.format(mTimeFormat, hour, min, sec);
>>  GPSMain.timer.setText("Time Taken: "+timeTaken);
    mHandler.postDelayed(mUpdateTime, 1000);

}

@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return null;
}
}

LogCat возвращает NullPointerException в следующей строке кода:

GPSMain.timer.setText("Time Taken: "+timeTaken);

Если я удаляю эту строку кода, код выполняется правильно *, хорошо я говорю правильно, поскольку он выполняется вплоть доконец кода приложения, но причина, по которой я хочу напечатать таймер на экране во время его подсчета, заключается в том, что мне нужно убедиться, что он работает правильно.

* он не только работает правильно, но и отображает текстовое представление таймера с определенной по умолчанию строкой из xml.Только когда я пытаюсь обновить его с Java, происходит сбой.

Вот полный XML-файл, на который ссылается код в этой точке:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Button
    android:id="@+id/stopbutton"
    android:layout_width="100px" 
    android:layout_height="100px" 
    android:text="Stop"
    android:layout_centerInParent="true"
/>
<TextView  
    android:id="@+id/timer2"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="Time Taken:       unknown"
    android:layout_below="@+id/timer"
    />
</RelativeLayout>

ОБНОВЛЕНИЕ!

MyTimer Class:

@SuppressWarnings("unchecked")
public class MyTimer extends AsyncTask { 

Timer _timerTask = new Timer();
static int totalSeconds = 0, hour = 0, min = 0, sec = 0;
static String mTimeFormat = "%02d:%02d:%02d";
static String timeTakenString;

@Override
protected Object doInBackground(Object... params) {

        TimerTask timer = new TimerTask() {

            @Override
            public void run() {

                totalSeconds += 1;
                sec += 1;
                if(sec >= 60) {
                    sec = 0;
                    min += 1;
                    if (min >= 60) {
                        min = 0;
                        hour += 1;
                    }
                }
                timeTakenString = String.format(mTimeFormat, hour, min, sec);
                GPSMain.timer.setText("Time Taken: "+GPSMain.timeTaken);

            }
        };
         (_timerTask).scheduleAtFixedRate(timer,1000,1000);

    return null;
}

}

Метод запуска потока таймера:

void startService(){

    setContentView(R.layout.stop);

    timer = (TextView) findViewById(R.id.timer2);

    GPSMain.button = (Button) findViewById(R.id.stopbutton);

    new MyTimer().execute();

}

Ответы [ 3 ]

2 голосов
/ 17 июня 2011

Зачем вам здесь Service? Почему бы тебе просто не использовать AsyncTask? Служба обычно используется, когда вам нужно запустить что-то в фоновом режиме, без макета, отображаемого пользователю. Ваше приложение показывает данные пользователю, поэтому лучший способ решить вашу проблему - запустить отдельный поток, а не сервис. Надеюсь, это поможет.

1 голос
/ 17 июня 2011

Ну, я серьезно не знаю много об услугах, но во всех случаях вы должны получать доступ к интерфейсу только из потока интерфейса.

В вашем случае я чувствую активность, в которой есть кнопка иСервис - это два разных класса, при этом сервис не обладает каким-либо объектом действия.
Я думаю, проблема в настройке представления текста из сервиса.но опять же, я не очень разбираюсь в услугах.

С другой стороны, я согласен с Егором: если у вас много действий, и каждый из них не выполняет большую часть сетевой активности, AsyncTask - это способиди.

Надеюсь, это поможет.

1 голос
/ 17 июня 2011

Вы можете использовать TimerTask вместо Service. Вот код ..

TimerTask timer = new TimerTask() {

            @Override
            public void run() {

                        // Here you can update your UI
    }
 }

Timer _timerTask = new Timer();
        _timerTask.scheduleAtFixedRate(timer,60000,60000);
...