我正在尝试在Android上实现异步,但它不断崩溃我的应用程序,doInBackground中的代码可以工作,如果我把它放在oncreate中,以便我知道它的工作原理 任何帮助是极大的赞赏 感谢
这是我的代码:
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
实施。您可以提供“结果类型”,而不是通过AsyncTask<Void, Void, Void>
声明后台任务,可以将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;
}