2012-01-26 8 views
1

私はAndroidで非同期を実装しようとしていますが、私のアプリをクラッシュさせてしまい、doInBackgroundのコードはoncreateに入れてもうまく動作することがわかります おかげ非同期のAndroidを実装するとアプリがクラッシュする

は、ここに私のコードです:

public class accueilEco extends Activity 
{ 
String[] param = new String[5]; 
TextView nom; 
TextView prenom; 
ProgressDialog mDialog; 
Context ctxt; 
TelephonyManager tm; 
connectEco ce; 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    nom = (TextView) findViewById(R.id.user); 
    ctxt = getBaseContext(); 
    tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); 
    new chargerParam().execute(); 

} 
public class chargerParam extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected void onPostExecute(Void result) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    protected void onPreExecute() { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    protected Void doInBackground(Void... params) { 

     try 
     { 
      ce =new connectEco(); 

      param = ce.recupereParam(tm.getDeviceId()); 

      if(String.valueOf(param[4]) == String.valueOf(1)) 
      { 
       Toast.makeText(ctxt, "Paramétres chargées" , Toast.LENGTH_LONG).show(); 
       //setContentView(R.layout.home); 
       nom.setText(param[1]+" "+ param[2]+" - "+param[3]); 

      } 
      else 
      { 
       Toast.makeText(ctxt, "=> login" , Toast.LENGTH_LONG).show(); 
      } 


     } 
     catch(Exception ex) 
     { 
      Toast.makeText(ctxt, "erreur" , Toast.LENGTH_LONG).show(); 
     } 

     return null; 
    } 


} 

}

+0

は、あなたの質問にログを追加してください。それは問題をより早く引き起こすでしょう。 –

答えて

4

あなたはUIスレッドとは別のスレッドからUIオブジェクトにアクセスすることはできません。コード:

nom.setText(param[1]+" "+ param[2]+" - "+param[3]); 

例外がスローされます。

あなたはonPreExecute()またはonPostExecute(Result)にいるときにUI要素にアクセスできます。 doInBackgroundでUI要素にアクセスすると、例外が発生します。


これを「修正」するには、AsyncTaskの実装を読んで理解する必要があります。​​でバックグラウンドタスクを宣言する代わりに、doInBackgroundメソッドからonPostExecuteメソッド(UIスレッド上)に転記できる「結果タイプ」を指定することができます。 AsyncTask<Void, Void, String>Stringタイプ)。

あなたはこのような何かをしなければならないでしょう:

@Override 
protected void onPostExecute(String result) { 
    if (result != null) 
     nom.setText(result); 
    // else show toast 
} 

@Override 
protected String doInBackground(Void... params) { 

    try { 
     String[] param = new connectEco().recupereParam(tm.getDeviceId()); 

     if (String.valueOf(param[4]) == String.valueOf(1)) 
      return param[1]+" "+ param[2]+" - "+param[3]; 

    } catch(Exception ex) { 
     // ignore and return null 
    } 

    return null; 
} 
+0

okそれでは、どうすればいいですか? –

+0

最新の回答をご覧ください。 –

+0

私はチェックしましたが、わかりませんでした。私はpostExecuteメソッドにgui "updates"を置くべきですか? –

関連する問題