Как управлять активностью из 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??
}
Другие вопросы по тегам