2013-11-25 4 views
-1

У меня есть система регистрации. Регистрация работает нормально. Моя основная проблема: я хотел бы запустить MainActivity.java после входа в систему. После отправки данных входа на сервер сервер проверяет в базе данных, если он соответствует и отправляет int (0 для непревзойденного) и (1 для успеха) , Это отлично работает. Но если я хочу, чтобы начать Намерение после метода onPostExecute он выдает ошибку:Android Intent после того, как onpostexecute не запускается

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

Это мой StartPage которого 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(); 
    } 
} 

} 

Это мой класс Асинхронного-Task, который получает данные от моего Java-сервера, и проверяет, было ли это успешным или непревзойденный логин. В onPostExecute im вызов метода в 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); 
} 
} 
+0

могли бы включить полная трассировка стека? –

+0

Вы просто не можете создавать свои собственные объекты «LoginPage», вызывая конструктор Activity. Android вызывает его для вас. Все, что вам нужно сделать, это просто реализовать обратные вызовы. Вам нужно немного почитать о действиях и фрагментах ... – gunar

ответ

0

Вы не можете просто создать экземпляр вашего activity с new ключевого слова, например:

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

Это неправильно и это, вероятно, почему вы получаете сообщение об ошибке. Код, который вы опубликовали, довольно сложный, поэтому я не уверен, есть ли какие-либо другие проблемы.

Это то, как это должно быть сделано:

Так ... Так как вы, вероятно, ConnectToServer AsyncTask в отдельном файле, необходимо передавать события или данные в вашей LoginPage деятельности. Для этого вы должны использовать прослушиватель событий, например:

Сначала создайте интерфейс, который будет представлять связь между вашим ConnectToServer и вашим LoginPage.

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. Но если я попытаюсь запустить Intent, это не сработает. Не могли бы вы предложить, как это сделать правильно? –

+0

@ charly_freak35 Пожалуйста, найдите время, чтобы прочитать мое сообщение внимательно. – hendrix

+0

большое спасибо! попробуем это :) –

Смежные вопросы