2014-02-26 29 views
0

我有兩個活動(Activity1Activity2)和一個的AsyncTask(AsyncTask1如何從的AsyncTask

Activity1管理活動有一個按鈕,在點擊控制權交給Activity2Activity2AsyncTask並在該任務的onPostExecute()我想處理Activity1中的TextView

實施例:

活性1

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?? 
    } 
} 

問題

如何在AsyncTask的onSuccess中設置名稱?

回答

0

Activity2有一個AsyncTask,並在該任務的onPostExecute()我想要 來處理Activity1中的TextView。

不,你不能。您可以在Activtiy1使用startActivtiyForResult和更新的TextView

在活動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(); 
} 
0

試試這個...

創建一個從商店的AsyncTask結果sharedPreference &完成活動在活動1一個sharedPreference上的成功。

在活動1中的onResume從sharedPreference &獲得的價值,如果它不爲空,設置爲命名的TextView ..

0

我想嘗試另一種方法。我沒有嘗試從AsyncTask中更改Activity 1的元素,而是將AsynTask的意圖發送到Activity 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 
    } 
}; 
0

可以使用靜態變量這樣做:

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?? 
}