onpostexecute之后的Android Intent无法启动

时间:2013-11-25 15:05:27

标签: android android-intent

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

  

致命的例外:主要   显示java.lang.NullPointerException   在android.app.Activity.startActivityForResult   ...

这是我的StartPage,它表示我的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中调用一个方法来处理Intent(这里是错误)。

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

1 个答案:

答案 0 :(得分:0)

您不能只使用activity关键字创建new的实例,如下所示:

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

现在,让LoginPage activity实现此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 async task时,您需要设置将在用户登录时处理事件的侦听器。由于您在活动中实现了此界面,因此您将发送activity对象作为listener参数,见下文:

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