2012-01-26 75 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(结果)时访问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

好的,那我该怎么办呢? –

+0

请参阅最新的答案。 –

+0

我查过,但我不确定,我应该把gui“更新”放在postExecute方法中否? –