Как управлять активностью из AsyncTask
У меня два занятия (Activity1
а также Activity2
) и один AsyncTask (AsyncTask1
)
Activity1
имеет кнопку, которая при нажатии дает контроль Activity2
, Activity2
имеет AsyncTask
и в этой задаче onPostExecute()
Я хочу справиться с TextView
это в Activity1
,
Пример:
Activity1
public class Activity1 extends RoboSherlockActivity {
@Inject (R.id.name) EditText name;
@Inject (R.id.mybutton) Button button;
public void onCreate (Bundle savedInstanceState) {
...
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent activity2 = new Intent(context, Activity2.class);
startActivity(activity2);
}
});
....
}
}
деятельности2
public class Activity2 extends RoboSherlockActivity {
@InjectView (R.id.name) EditText secret;
....
public boolean onCreateOptionsMenu(Menu menu) {
menu.add("Save")
return true;
}
...
@Override
public boolean onOptionsItemSelected(MenuItem menuItem) {
if (menuItem.getTitle().toString().equalsIgnoreCase("Save")) {
new AsyncTask1(this, secret.getText().toString()).execute();
}
return true;
}
}
AsyncTask1
public class AsyncTask1 extends RoboAsyncTask<String> {
Activity2 activity;
String secret;
public AsyncTask1 (Activity2 activity, String secret) {
this.activity = activity;
this.secret = secret;
}
public String call() throws Exception {
//call the server here
return "";
}
protected void onSuccess(String result) {
activity.finis();
//HERE I WANT TO SET THE NAME: name.setText(result); //How can I do this??
}
}
Вопрос
Как я могу установить имя в onSuccess
AsyncTask?
4 ответа
Activity2 имеет AsyncTask, и в onPostExecute() этой задачи я хочу обработать TextView, который находится в Activity1.
Нет, ты не можешь. Ты можешь использовать startActivtiyForResult
в Activtiy1 и обновить текстовое представление
В Деятельности1
Intent intent=new Intent(Activity.this,Activity2.class);
startActivityForResult(intent, 2);
затем
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
// check if the request code is same as what is passed here it is 2
if(requestCode==2)
{
String message=data.getStringExtra("key");
textView1.setText(message);
}
}
В Деятельности2
Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.second);
intent = getIntent();
...// rest of the code
}
В onSuccess
protected void onSuccess(String result) {
intent.putExtra("key",value);
setResult(2,intent);
activity.finish();
}
Попробуй это...
Создайте sharedPreference в Activity1, в случае успеха из асинхронного хранилища вы получите sharedPreference & finish Activity.
В onResume Activity1 получить значение из sharedPreference и, если оно не равно нулю, установить имя Textview.
Я бы попробовал другой подход. Вместо того, чтобы пытаться изменить элемент Упражнения 1 из AsyncTask, я бы отправил намерение из AsynTask в Упражнение 1.
protected void onSuccess(String result) {
activity.finish();
Intent intent = new Intent("MY_CUSTOM_INTENT");
activity.sendBroadcast(intent);
}
И в деятельности
@Override
public void onResume(){
super.onResume();
LocalBroadcastManager.getInstance(this).registerReceiver(myHandler, new IntentFilter("MY_CUSTOM_INTENT");
}
BroadcastReceiver myHandler= new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//CHANGE HERE THE TEXTVIEW
}
};
Вы можете использовать статические переменные для этого:
public class Activity1 extends RoboSherlockActivity {
...
public static Activity1 instance = null;
public EditText getName(){
return name;
}
public void onCreate (Bundle savedInstanceState) {
...
instance = this;
....
}
public void onDestroy(){
instance = null;
}
}
И назвать это методами:
protected void onSuccess(String result) {
activity.finis();
Activity1.instance.getName.setText(result);
//HERE I WANT TO SET THE NAME: name.setText(result); //How can I do this??
}