2012-02-04 90 views
0

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

堆栈(logcat的决定随机停止在蚀工作由于某种原因)

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 [在] 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> 

回答

0

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

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

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

尽量不要有两个活动的主要意图过滤器。

相关问题