StartActivity上的NullPointerException(Android)

时间:2012-02-04 00:16:02

标签: java android android-intent android-activity

我知道已经提出了类似的问题,但是通过阅读它们之后,似乎有很多事情可以做错导致这个问题。这是我的第一个真正的Android(和Java)应用程序,我可能已经做了大部分。在此先感谢您的帮助!

堆栈 (由于某种原因,Logcat决定随机停止在eclipse中工作)

Thread [<1> main] (Suspended (exception NullPointerException))  
GMSerial_CleanActivity(Activity).startActivityForResult(Intent, int) line: 3190 
GMSerial_CleanActivity(Activity).startActivity(Intent) line: 3297   
GMSerial_CleanActivity.output(String, String, String, TextView) line: 49    
GMSerial_CleanActivity$1.onCheckedChanged(CompoundButton, boolean) line: 35 
ToggleButton(CompoundButton).setChecked(boolean) line: 125  
ToggleButton.setChecked(boolean) line: 72   
ToggleButton(CompoundButton).toggle() line: 87  
ToggleButton(CompoundButton).performClick() line: 99    
View$PerformClick.run() line: 14105 
ViewRootImpl(Handler).handleCallback(Message) line: 605 
ViewRootImpl(Handler).dispatchMessage(Message) line: 92 
Looper.loop() line: 137 
ActivityThread.main(String[]) line: 4424    
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]  
Method.invoke(Object, Object...) line: 511  
ZygoteInit$MethodAndArgsCaller.run() line: 784  
ZygoteInit.main(String[]) line: 551 
NativeStart.main(String[]) line: not available [native method]  

主要代码

package com.greymatterrobotics.gmserial;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.ToggleButton;
import android.widget.TextView;
import android.widget.EditText;
import android.widget.CheckBox;
import android.widget.CompoundButton;



public class GMSerial_CleanActivity extends Activity {

    static public final char cr = (char) 13;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        final GMSerial_CleanActivity GMSerial = new GMSerial_CleanActivity();
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        ToggleButton toggleSend = (ToggleButton) findViewById(R.id.toggleSend);
        final TextView textLog = (TextView) findViewById(R.id.textLog);
        final EditText editBaud = (EditText) findViewById(R.id.editBaud);
        final EditText editDelay = (EditText) findViewById(R.id.editDelay);
        //final CheckBox checkInvert = (CheckBox) findViewById(R.id.checkInvert);

        toggleSend.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if(isChecked){
                    GMSerial.output(editBaud.getText().toString(), "Hello World", editDelay.getText().toString(), textLog);
                }

            }
        });

    }

    public void output(String baud, String data, String delay, TextView log) {
        Intent serialout = new Intent();
        serialout.setClassName("com.greymatterrobotics.gmserial", "com.greymatterrobotics.gmserial.Output");
        serialout.putExtra("BAUD", baud);
        serialout.putExtra("DATA", data);
        serialout.putExtra("CHD", delay);
        startActivity(serialout);
        log.setText(log.getText().toString() + cr + data);
    }
}

输出代码(由spiritplumber [at] gmail.com提供)

package com.greymatterrobotics.gmserial;

import android.app.Activity;
import android.os.Bundle;
import android.os.SystemClock;

public class Output extends Activity {

    static public final char cr = (char) 13; // because i don't want to type that in every time
    static public final char lf = (char) 10; // because i don't want to type that in every time
    public String datatosend = "";


    @Override
    public void onCreate(Bundle savedInstanceState) {
        AudioSerialOutMono.activate();
        try{
            Bundle bundle = getIntent().getExtras();
            if (bundle.containsKey("BAUD"))
                AudioSerialOutMono.new_baudRate = Integer.parseInt(bundle.getString("BAUD"));
            if (bundle.containsKey("CHD"))
                AudioSerialOutMono.new_characterdelay = Integer.parseInt(bundle.getString("CHD"));
            if (bundle.containsKey("DATA"))
                datatosend = (bundle.getString("DATA"));
            AudioSerialOutMono.UpdateParameters(true);
            AudioSerialOutMono.output(datatosend+cr+lf);

            while (AudioSerialOutMono.isPlaying())
            {
                SystemClock.sleep(50);
            }
        }catch(Exception e){e.printStackTrace();}


//      android.os.Process.killProcess(android.os.Process.myPid()); // NUKE
        super.onCreate(savedInstanceState);
        this.finish();
    }
}

的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.greymatterrobotics.gmserial"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="3" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".GMSerial_CleanActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".Output"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
            </intent-filter>
        </activity>
    </application>

</manifest>

2 个答案:

答案 0 :(得分:0)

尝试不对两个活动都使用MAIN意图过滤器。

答案 1 :(得分:0)

Android中的Activity生命周期由系统自动处理。我的意思是,您不应该创建GMSerial_CleanActivity活动的新实例。您应该直接调用output方法。请勿致电GMSerial.output

另外,在output方法中,我更喜欢使用下面的代码来开始一个新活动(你的代码片段可能是正确的。我没有手头的Eclipse,因此无法测试它)。

Intent serialout = new Intent();
    serialout.setClass(this, Output.Class);