сбой приложения при реализации асинхронного Android - PullRequest
1 голос
/ 26 января 2012

Я пытаюсь реализовать асинхронность на 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;
    }


}

}

1 Ответ

4 голосов
/ 26 января 2012

Вы не можете получить доступ к объектам пользовательского интерфейса из другого потока, чем поток пользовательского интерфейса.Код:

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

вызовет исключение.

Вы можете получить доступ к элементам пользовательского интерфейса, когда находитесь в onPreExecute () или onPostExecute (Result).Доступ к элементам пользовательского интерфейса, пока вы находитесь в doInBackground, приведет к исключению.


Чтобы «исправить» это, вам нужно прочитать и понять реализацию AsyncTask.Вместо объявления фоновой задачи с помощью AsyncTask<Void, Void, Void> вы можете указать «тип результата», который можно опубликовать из метода doInBackground в метод onPostExecute (в потоке пользовательского интерфейса).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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...