2013-11-25 100 views
-1

我有一个注册系统。注册工作正常。我的主要问题是:我想在登录后启动MainActivity.java。在将登录数据发送到服务器后,服务器检查数据库是否匹配并发送一个int(0表示不匹配)和(1表示成功) 。这也很好。但是,如果我要开始后onPostExecute法的意图它给出了一个错误:Android onpostexecute无法启动后的意图

FATAL EXCEPTION: main java.lang.NullPointerException at android.app.Activity.startActivityForResult ...

这是我的起始页其中exectues我的AsyncTask类。并在getLoginMessage()方法中获得成功或无法匹配。

public class LoginPage extends Activity { 

String userName; 
String password; 
String sendProtocolToServer; 
static String matched = null; 
static String unmatched; 
static Context myCtx; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_loginpage); 

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

    Button login = (Button) findViewById(R.id.loginBtn); 
    login.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      handleLogin(); 
     } 
    }); 

    Button register = (Button) findViewById(R.id.registerBtn); 
    register.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      Intent openMainActivityRegister = new Intent(
        "com.example.fotosharing.REGISTERPAGE"); 
      startActivity(openMainActivityRegister); 
     } 
    }); 

} 

private void handleLogin() { 

    EditText editTextBox = (EditText) findViewById(R.id.EditTextUser); 
    EditText passwordTextBox = (EditText) findViewById(R.id.EditTextPassword); 
    userName = editTextBox.getText().toString(); 
    password = passwordTextBox.getText().toString(); 

    if (!userName.equals("") && !password.equals("")) { 
     sendProtocolToServer = "login" + "#" + userName + "#" + password; 
     ConnectToServer cts = new ConnectToServer(sendProtocolToServer); 

     cts.execute(); 
    } else { 
     Toast.makeText(this, "Fill in Username and Password to login", 
       Toast.LENGTH_LONG).show(); 
    } 

} 

public void getLoginMessage(String receivedMessage) { 

    if (receivedMessage.equals("success")) { 
     Intent openMainActivity = new Intent(
       "com.example.fotosharing.TIMELINEACTIVITY"); 
     openMainActivity.clone(); 
     startActivity(openMainActivity); 

    } 

    if (receivedMessage.equals("unmatched")) { 
     Toast.makeText(this, "Password or username incorrect.", Toast.LENGTH_LONG).show(); 
    } 
} 

} 

这是我的Async-Task类,它从我的Java-Server接收数据,并检查它是否成功或不匹配的登录。在onPostExecute即时调用LoginPage.class中的一个方法,它处理意图(这里是错误)。

public class ConnectToServer extends AsyncTask<Void, Void, String> { 
    public Context myCtx; 
    static Socket socket; 
    String sendStringToServer; 
    int protocolId = 0; 
    private static DataOutputStream DOS; 
    private static DataInputStream DIS; 
    StringBuffer line; 
    int j = 1; 
    String value; 
    static String res = null; 

public ConnectToServer(String sendStringToServer) { 
    this.sendStringToServer = sendStringToServer; 
} 

public ConnectToServer(int i) { 
    this.protocolId = i; 
} 

public ConnectToServer() { 

} 

public ConnectToServer(Context ctx) { 
    this.myCtx = ctx; 
} 

protected String doInBackground(Void... arg0) { 

    try { 
     socket = new Socket("192.168.1.106", 25578); 
     DOS = new DataOutputStream(socket.getOutputStream()); 

     if (protocolId == 1) { 
      DOS.writeUTF("pictureload"); 
      protocolId = 0; 

     } else { 
      DOS.writeUTF(sendStringToServer); 

     } 

     res = receive(); 
     // DOS.close(); 
    } catch (UnknownHostException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    System.out.println("RES: " + res); 

    return res; 
} 

public String receive() { 
    String receiveResult = null; 

    if (socket.isConnected()) { 

     try { 
      BufferedReader input = new BufferedReader(
        new InputStreamReader(socket.getInputStream())); 

      DIS = new DataInputStream(socket.getInputStream()); 
      int msg_received = DIS.readInt(); 

      System.out.println("SERVER: " + msg_received); 

      if (msg_received == 1) { 
       receiveResult = "success"; 
       System.out.println("IF (success): " + receiveResult); 

      } 

      if (msg_received == 0) { 
       receiveResult = "unmatched"; 
       System.out.println("ELSE IF (unmatched): " 
         + receiveResult); 

      } 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    // ***** return your accumulated StringBuffer as string, not current 
    // line.toString(); 
    return receiveResult; 

} 

protected void onPostExecute(String result1) { 

    if (result1 != null) { 
     if (result1.equals("success") || result1.equals("unmatched")) { 
      sendToLoginPage(result1); 
     } 
    } 
} 

private void sendToLoginPage(String result1) { 
    System.out.println("sendtologi " + result1); 
    LoginPage lp = new LoginPage(); 
    lp.getLoginMessage(result1); 
} 

} 

这是我想在成功登录时启动的类。 我在做什么错?

public class MainActivity extends SherlockFragmentActivity { 


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

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

    ActionBar actionbar = getSupportActionBar(); 
    actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
    actionbar.setBackgroundDrawable(new ColorDrawable(Color.BLACK));   
    actionbar.setStackedBackgroundDrawable(new ColorDrawable(Color.parseColor("#91d100"))); 

    ActionBar.Tab Frag1Tab = actionbar.newTab().setText("Home"); 
    ActionBar.Tab Frag2Tab = actionbar.newTab().setText("Share Photo"); 

    Fragment Fragment1 = new TimelineActivity(); 
    Fragment Fragment2 = new CameraActivity(); 

    Frag1Tab.setTabListener(new MyTabsListener(Fragment1)); 
    Frag2Tab.setTabListener(new MyTabsListener(Fragment2)); 

    actionbar.addTab(Frag1Tab); 
    actionbar.addTab(Frag2Tab); 
} 
} 
+0

您可以包括完整的堆栈跟踪? –

+0

您只需调用Activity构造函数即可创建自己的LoginPage对象。 Android会为你打电话。你所要做的只是实现回调。你需要阅读一些活动和片段...... – gunar

回答

0

你不能只是创建activitynew关键字的情况下,像这样:

private void sendToLoginPage(String result1) { 
    System.out.println("sendtologi " + result1); 
    LoginPage lp = new LoginPage(); 
    lp.getLoginMessage(result1); 
} 

这是错误,它可能是为什么您收到错误。您发布的代码非常复杂,所以我不确定是否还有其他问题。

这是应该怎么做:

所以...因为你很可能有ConnectToServer的AsyncTask单独的文件中,你需要通过事件或数据传输到LoginPage活动。为此,您应该使用事件监听器,如下所示:

首先,创建将代表您的ConnectToServerLoginPage之间通信的接口。现在

public interface LoginResultListener { 
    public void getLoginMessage(String receivedMessage); 
} 

,让你的LoginPageactivity实现这个interface

public class LoginPage extends Activity implements LoginResultListener { 
... 
} 

现在,更新ConnectToServer的AsyncTask,以便它使用LoginResultListener到登录结果传达给你的活动,如:

public class ConnectToServer extends AsyncTask<Void, Void, String> { 

    private LoginResultListener listener; 
... 
    public void setListener(LoginResultListener listener) { 
    this.listener = listener; 
    } 
... 
    private void sendToLoginPage(String result1) { 
    System.out.println("sendtologi " + result1); 
    //THIS IS WHERE YOU DID WRONG 
    listener.getLoginMessage(result1); 
    } 
... 
} 

现在终于,当你创建new ConnectToServer。从你的行为,你需要设置监听器将处理事件时,在用户登录既然你实现你的活动这个界面中,你会送你的活动对象为收听参数,见下图:

ConnectToServer cts = new ConnectToServer(sendProtocolToServer); 
// THIS IS IMPORTANT PART - 'this' refers to your LoginPage activity, that implements LoginResultListener interface 
cts.setListener(this); 
cts.execute(); 
+0

上面的方法正确地将数据发送到LoginPage。但是,如果我尝试启动意图失败。你能否提出一个建议如何做到这一点? –

+0

@ charly_freak35请花点时间仔细阅读我的文章。 – hendrix

+0

非常感谢!将试试:) –