2015-10-02 2 views
0

здесь у меня есть некоторые проблемы при разработке приложения для Android. Я хочу сделать приложение для викторины, которое позволяет пользователю выбрать ответ, приложение сохранит его внутри массива, и приложение подсчитает, что все пользователи выбирают, когда пользователю будет дан ответ на все вопросы.Confuse Использование AsyncTask на Android Studio

Но здесь я смущаюсь при использовании AsyncTask, чтобы сохранить ответ, потому что я не хочу использовать фрагмент для окна вопроса, и я хочу, когда пользователь нажмет кнопку «Далее», ответ пользователя будет сохранен в некотором массиве с методом AsyncTask. Но вот внутри doInBackground я понятия не имею, как вернуть массив из него и поймать внутри mainActivity.

Я очень смущаюсь, пожалуйста, помогите мне.

Thanks Before.

NB. это мой код MainActivity.java (который содержит метод AsyncTask)

public class MainActivity extends ActionBarActivity { 
Button btnKet1 = (Button)findViewById(R.id.btn1); 
Button btnKet2 = (Button)findViewById(R.id.btn2); 
Button btnKet3 = (Button)findViewById(R.id.btn3); 
Button btnKet4 = (Button)findViewById(R.id.btn4); 
Button btnNext = (Button)findViewById(R.id.btnNext); 
TextView txtKet = (TextView)findViewById(R.id.txtKeterangan); 
RadioButton rd1 = (RadioButton)findViewById(R.id.rd1); 
RadioButton rd2 = (RadioButton)findViewById(R.id.rd2); 
RadioButton rd3 = (RadioButton)findViewById(R.id.rd3); 
RadioButton rd4 = (RadioButton)findViewById(R.id.rd4); 
public static String answer; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    onButtonClickListener(); 
} 

private void onRadioButtonClick(){ 
    if(rd1.isChecked()){ 
     answer = "1"; 
    }else if(rd2.isChecked()){ 
     answer = "2"; 
    }else if (rd3.isChecked()){ 
     answer = "3"; 
    }else if (rd4.isChecked()){ 
     answer = "4"; 
    }else{ 
     answer = "0"; 
    } 
} 
private void onButtonClickListener(){ 
    btnNext.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
     onRadioButtonClick(); 
      AsyncTaskRunner runner = new AsyncTaskRunner(); 
      runner.execute(answer); 

     } 
    }); 

    btnKet1.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

     } 
    }); 

    btnKet2.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

     } 
    }); 

    btnKet3.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

     } 
    }); 

    btnKet4.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

     } 
    }); 
} 

private class AsyncTaskRunner extends AsyncTask<String, String, Integer[]>{ 
    private int[] answerpasti = new int[40]; 
    Integer answertemp = Integer.parseInt(answer); 
    String respon; 

    @Override 
    protected Integer[] doInBackground(String... params) { 
     publishProgress("Antos Jep Kleng"); // Calls onProgressUpdate() 
     try { 
      for(int i = 0;i<40;i++){ 
       answerpasti[i]=answertemp; 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
      respon = e.getMessage(); 
     } 
     return answerpasti[]; 
    } 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

}

ответ

1

Прежде всего. Для этого вам не нужны и AsyncTask. В любом случае вы должны использовать onPostExecute, чтобы вернуть результат в основной поток. Существует тысячи примеров использования asynctask на web

Но опять-таки вам не нужна задача async для этого.

+0

так что я не нужен AsyncTask для хранения ответа от пользователя? – iWayan

+0

AsyncTask следует использовать только для обработки данных вне основного потока! Если вы хотите сохранить данные, есть много других вариантов. –

+0

хорошо, есть ли у вас какие-либо советы, какой метод я должен использовать? – iWayan

0

Чтобы вернуть результат из AsyncTask, вы должны либо использовать метод onProgressUpdate для частичных результатов, либо метод onPostExecute для получения результатов после завершения задачи async. Так что если ваш метод doInBackground возвращает целочисленный массив, ваш onPostExecuteMethod получит этот массив в качестве параметра, а затем вы должны сохранить его в собственности вашего MainActivity

public class MainActivity extends ActionBarActivity{ 
    //property to store the result of the asyncTask 
    private Integer []arr; 
    private class AsyncTaskRunner extends AsyncTask<String, String, Integer[]>{ 

    @Override 
    protected Integer[] doInBackground(String... params) { 
     ... 
    } 
    } 
    @Override 
    protected void onPostExecute(Integer[]result) { 
    MainActivity.this.arr=result; 
    } 
} 

Больше информации here

+0

Я все еще не понимаю, может у, пожалуйста, скажите мне, где мой недостаток при написании моего кода? потому что он всегда показывает ошибку Неожиданный токен в строке, когда я пишу «return answerpasti [];» – iWayan

Смежные вопросы