2013-06-10 4 views
1

J'utilise déjà AsyncTask, mais je ne comprends pas pourquoi j'ai toujours eu une erreur quand j'ai testé sur mon appareil (OS 4.0). mon apk construit en 2.3.3. Je pense que j'ai mal fait les codes, mais je ne sais pas où est mon erreur. Tout le monde s'il vous plaît aidez-moi, je vous remercie beaucoupeu une erreur avec AsyncTask

login.java

package com.karismaelearning; 

    public class Login extends Activity { 
     public Koneksi linkurl; 
     String SERVER_URL; 
     private Button login, register, setting; 
     private EditText username, password; 
     public ProgressDialog progressDialog; 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.login); 

      setting = (Button)findViewById(R.id.bsetting); 
      login = (Button) findViewById(R.id.login); 
      register = (Button) findViewById(R.id.reg); 
      username = (EditText) findViewById(R.id.uname); 
      password = (EditText) findViewById(R.id.pass); 

      setting.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        Intent intentSet = new Intent(Login.this, UrlSetting.class); 
        startActivity(intentSet); 
       } 
      }); 

      register.setOnClickListener(new OnClickListener() { 

       public void onClick(View v) { 
        Intent intentReg = new Intent(Login.this, Register.class); 
        startActivity(intentReg); 
       } 
      }); 

      login.setOnClickListener(new OnClickListener() { 

       public void onClick(View v) { 
        new LoginTask().execute(); 
       } 
      }); 

     } 
     protected String tryLogin(String mUsername, String mPassword){   
      Log.d(" TryLoginCheck ","Here"); 
      HttpURLConnection connection; 
      OutputStreamWriter request = null; 

       URL url = null; 
       String response = null; 
       String temp=null; 
       String parameters = "username="+mUsername+"&password="+mPassword; 
       System.out.println("UserName"+mUsername+"\n"+"password"+mPassword); 
       Log.d("Parameters",parameters); 
       try{ 
        linkurl = new Koneksi(this); 
        SERVER_URL = linkurl.getUrl(); 
        SERVER_URL += "/mobile/Login.php"; 
        url = new URL(SERVER_URL); 
        connection = (HttpURLConnection) url.openConnection(); 
        connection.setDoOutput(true); 
        connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
        connection.setRequestMethod("POST");  

        request = new OutputStreamWriter(connection.getOutputStream()); 
        request.write(parameters); 
        request.flush(); 
        request.close();    
        String line = "";    
        InputStreamReader isr = new InputStreamReader(connection.getInputStream()); 
        BufferedReader reader = new BufferedReader(isr); 
        StringBuilder sb = new StringBuilder(); 
        while ((line = reader.readLine()) != null) { 
         sb.append(line + "\n"); 
        } 
        temp=sb.toString(); 
        Log.d("Temp",temp); 

        response = sb.toString(); 
        Log.d("Response",response); 
        Log.d("Sb Value",sb.toString()); 
        isr.close(); 
        reader.close(); 
       } 
       catch(IOException e) { 
        Toast.makeText(this,e.toString(),Toast.LENGTH_SHORT).show(); 
       } 

       return response; 
     } 

     public class LoginTask extends AsyncTask<String, String, String> { 

    String response = null; 

    @Override 
    protected void onPreExecute() 
    { 

    } 
    @Override 
    protected String doInBackground(String... arg0) 
    { 
    String mUsername = username.getText().toString(); 
      String mPassword = password.getText().toString(); 

      response = tryLogin(mUsername, mPassword).trim(); 
     return response; 
    } 
    protected void onPostExecute(String result){ 

     if(result==null) 
     { 
      Toast.makeText(Login.this,"result is null- an error occured",Toast.LENGTH_SHORT).show(); 
     } 
     else{ 

    Log.d("Check","Here"); 
     Log.d("Response",response); 
    if(response.toLowerCase().contains("berhasil")) 
      { 
       String nama = username.getText().toString(); 
       Intent newIntent = new Intent(Login.this, MainPage.class); 

       Bundle bundle = new Bundle(); 

       bundle.putString("nama", nama); 

       newIntent.putExtras(bundle); 
       startActivityForResult(newIntent, 0); 
      } 
      else 
      { 
       //Optional 
       //Kalau bisa dibuat constant untuk menghindari salah penulisan 
       String RoleError = "ROLE SALAH"; 
       String UserError = "USER SALAH"; 

       createDialog("Maaf", response.equals(RoleError) ? "Role Anda bukan Student!" : "Username Atau Password Salah!"); 
      } 
     } 
    } 
     } 
     private void createDialog(String title, String text) { 
      AlertDialog ad = new AlertDialog.Builder(this) 
      .setPositiveButton("Ok", null) 
      .setTitle(title) 
      .setMessage(text) 
      .create(); 
      ad.show(); 
     } 
    } 

LogCat

06-10 16:50:00.082: D/TryLoginCheck(4534): Here 
06-10 16:50:00.090: I/System.out(4534): UserName 
06-10 16:50:00.090: I/System.out(4534): password 
06-10 16:50:00.090: D/Parameters(4534): username=&password= 
06-10 16:50:00.122: W/dalvikvm(4534): threadid=11: thread exiting with uncaught exception (group=0x40bd31f8) 
06-10 16:50:00.129: E/AndroidRuntime(4534): FATAL EXCEPTION: AsyncTask #1 
06-10 16:50:00.129: E/AndroidRuntime(4534): java.lang.RuntimeException: An error occured while executing doInBackground() 
06-10 16:50:00.129: E/AndroidRuntime(4534):  at android.os.AsyncTask$3.done(AsyncTask.java:278) 
06-10 16:50:00.129: E/AndroidRuntime(4534):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
06-10 16:50:00.129: E/AndroidRuntime(4534):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
06-10 16:50:00.129: E/AndroidRuntime(4534):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
06-10 16:50:00.129: E/AndroidRuntime(4534):  at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
06-10 16:50:00.129: E/AndroidRuntime(4534):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208) 
06-10 16:50:00.129: E/AndroidRuntime(4534):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
06-10 16:50:00.129: E/AndroidRuntime(4534):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
06-10 16:50:00.129: E/AndroidRuntime(4534):  at java.lang.Thread.run(Thread.java:856) 
06-10 16:50:00.129: E/AndroidRuntime(4534): Caused by: java.lang.NullPointerException 
06-10 16:50:00.129: E/AndroidRuntime(4534):  at com.karismaelearning.Login$LoginTask.doInBackground(Login.java:151) 
06-10 16:50:00.129: E/AndroidRuntime(4534):  at com.karismaelearning.Login$LoginTask.doInBackground(Login.java:1) 
06-10 16:50:00.129: E/AndroidRuntime(4534):  at android.os.AsyncTask$2.call(AsyncTask.java:264) 
06-10 16:50:00.129: E/AndroidRuntime(4534):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
06-10 16:50:00.129: E/AndroidRuntime(4534):  ... 5 more 
06-10 16:50:05.192: D/OpenGLRenderer(4534): Flushing caches (mode 0) 
06-10 16:50:06.309: D/OpenGLRenderer(4534): Flushing caches (mode 1) 
06-10 16:50:07.536: I/Process(4534): Sending signal. PID: 4534 SIG: 9 
+0

Qu'est-ce que cela fait? 'response = tryLogin (mUsername, mPassword) .trim()' – Raghunandan

+0

Je veux que la réponse soit redirigée vers 'protected trylogin()'. – blackneko

+0

@blackneko l'erreur affichée est parce que vous ne pouvez pas appeler 'Toast' d'un thread d'arrière-plan (voir mon répondeur sur cela). Cependant, si vous voulez résoudre le problème à l'origine de l'exception, alors je vous suggère 'Log.d (...)' l'exception pour aider à déterminer quel est le problème. – Stochastically

Répondre

5

dans tryLogin, lorsqu'une exception se produit, vous faites:

Toast.makeText(this,e.toString(),Toast.LENGTH_SHORT).show(); 

qui est faux. Le Toast.show() doit s'exécuter sur le thread UI.

dans

tryLogin() { 

    try { 

    } catch(IOException e) { 
     return null; 
    } 

} 

et

protected void onPostExecute(String result){ 

    if (result == null) { 
    Toast.makeText(Login.this,"result is null- an error occured"),Toast.LENGTH_SHORT).show(); 
    } else { 
     result = result.trim(); 
     // the other stuff 
    } 

} 

@Override 
protected String doInBackground(String... arg0) 
{ 
    String mUsername = username.getText().toString(); 
    String mPassword = password.getText().toString();   
    return tryLogin(mUsername, mPassword); 
} 
+0

comme suggéré ci-dessus utiliser runonuithread ou retourner une valeur booléenne dans doInbackground (param) et basé sur le toast d'affichage des résultats dans onPostExecute (résultat) – Raghunandan

+0

+1 pour la mise à jour nice. et aussi la garniture 'response = tryLogin (mUsername, mPassword) .trim()' est la garniture requise? – Raghunandan

+0

quand je montre le pain grillé est-ce comme ça? 'Toast.makeText (Login.this, e.toString(), Toast.LENGTH_SHORT) .show();' ou juste toast.show? – blackneko

0

Connexion demande formulée dans la méthode doInBackground(). Et gérer la réponse à onPostExecute() de AsyncTask

+0

Demande de connexion est-il comme dans mon code ou faux? Je n'ai pas compris @ _ @ – blackneko

+0

Ohh désolé pour erreur.Je ne pouvais pas voir. Bon merci –

+0

alors, quelle est mon erreur @ _ @ pourquoi l'erreur se produit encore? O.o – blackneko

0

Le Toast ne fonctionnera pas dans le catch car le thread d'arrière-plan ne peut pas accéder à l'interface utilisateur. Cependant, le onPostExecute s'exécute sur le thread principal, donc il a accès à l'interface utilisateur et toast fonctionnera à partir de là. Donc je définirais une nouvelle classe pour contenir le résultat de la tâche asynchrone, et la configurer pour que la classe puisse représenter le succès ou un message d'erreur. Ensuite, faites en sorte que le onPostExecute se comporte en conséquence, selon qu'une erreur s'est produite ou non.

0

Si je comprends bien, l'erreur est due à Looper.prepare() n'est pas appelé manuellement ou automatiquement à partir de la structure.

Essayez d'appeler

super()
dans le constructeur de votre
LoginTask
(De ma compréhension, Lorsque vous étendez AsyncTask et exécutez/démarrez à partir thread d'interface utilisateur que vous obtiendrez pas cette exception parce que Looper sera préparé automatiquement par classe super.)

ou. Un correctif rapide (non recommandé): appelez Looper.prepare() dans doInBackground

@Override 
protected String doInBackground(String... arg0) { 

    try { 
     Looper.prepare(); 
    } catch (Exception e){ 
     // ignore. There can be only one Looper associated with thread 
     // This happens when the current thread already has Looper associated with it 
    } 

    //TODO: Your original content of doInBackground(...) 
} 

p.s. Si vous créez des threads personnalisés en étendant Thread mais ne pas préparer Looper et en utilisant le contexte des éléments de l'interface utilisateur (par exemple, To toast message) Android lancera Looper exception non préparée!

1

Pour comprendre pourquoi la tryLogin routine ne fonctionne pas, je suggère la suite @ suggestion de BlackBelt sauf pour tryLogin() utilise:

tryLogin() { 

    try { 

    } catch(Throwable e) { 
     e.printStackTrace(); 
     Log.d("Error",e.getMessage()); 
     return null; 
    } 

} 

et regardez les messages d'erreur produits.

+0

Je poste déjà mon nouveau numéro ici [link] http://stackoverflow.com/questions/17022040/get-null-in-asynctask s'il vous plaît regardez-le, et s'il vous plaît aidez-moi. je vous remercie – blackneko

+0

J'ajoute votre code dans mes codes, il n'y a pas de message apparaître et quand je tester dans l'appareil il n'y a pas de logcat apparaître. O.o – blackneko

+0

Je vois que vous avez utilisé ma suggestion ici dans votre nouveau post. Dans ce cas, il est d'usage de marquer cette suggestion comme "utile". – Stochastically