首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >AsyncTask :将值传递给活动(onCreate方法)

AsyncTask :将值传递给活动(onCreate方法)
EN

Stack Overflow用户
提问于 2012-03-16 18:12:33
回答 3查看 6.3K关注 0票数 3

Update1

活动:

代码语言:javascript
运行
复制
public Integer _number = 0;
@Override
    public void onCreate(Bundle savedInstanceState) {
if (_number >0)
        {
            Log.d("onSuccessfulExecute", ""+_number);
        }
        else
        {
            Log.d("onSuccessfulExecute", "nope empty songs lists");
        }
}

public int onSuccessfulExecute(int numberOfSongList) {

_number = numberOfSongList;

if (numberOfSongList >0)
{
    Log.d("onSuccessfulExecute", ""+numberOfSongList);
}
else
{
    Log.d("onSuccessfulExecute", "nope empty songs lists");
}
    return numberOfSongList;
}

end Update1

更新: AsynchTask有自己的外部类。

如何从AsyncTask onPostExecute()传递值.转到活动

我的代码确实从onPostExecute()返回值并在UI上更新,但是我正在寻找一种方法来设置来自AsynchTask的活动变量(NumberOfSongList)。

AsyncTask类:

代码语言:javascript
运行
复制
@Override
    public void onPostExecute(asynctask.Payload payload)
    {  
         AsyncTemplateActivity app = (AsyncTemplateActivity) payload.data[0];

             //the below code DOES UPDATE the UI textView control
             int answer = ((Integer) payload.result).intValue();
             app.taskStatus.setText("Success: answer = "+answer);

            //PROBLEM:
            //i am trying to populate the value to an variable but does not seems like the way i am            doing:
            app.NumberOfSongList = payload.answer;
            ..............
            ..............
    }

活动:

代码语言:javascript
运行
复制
  public Integer NumberOfSongList;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main); 

        //Several UI Code   
        new ConnectingTask().execute();
        Log.d("onCreate", ""+NumberOfSongList);

    } 
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-16 18:53:41

那么使用setter方法呢?例如:

代码语言:javascript
运行
复制
private int _number;
public int setNumber(int number) {
    _number = number;
}

更新:

请看这段代码。这样就能完成你想要完成的任务。

活动类

代码语言:javascript
运行
复制
public class TestActivity extends Activity {
    public int Number;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        setContentView(R.layout.test);

        Button btnDisplay = (Button) findViewById(R.id.btnDisplay);
        btnDisplay.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                Toast toast = Toast.makeText(v.getContext(), "Generated number: " + String.valueOf(Number), Toast.LENGTH_LONG);
                toast.show();               
            }
        });

        new TestTask(this).execute();
    }
}

AsyncTask类

代码语言:javascript
运行
复制
public class TestTask extends AsyncTask<Void, Void, Integer> {
    private final Context _context;
    private final String TAG = "TestTask";
    private final Random _rnd;

    public TestTask(Context context){
        _context = context;
        _rnd = new Random();
    }

    @Override
    protected void onPreExecute() {
        //TODO: Do task init.
        super.onPreExecute();
    }

    @Override
    protected Integer doInBackground(Void... params) {
        //Simulate a long-running procedure.
        try {
            Thread.sleep(3000);         
        } catch (InterruptedException e) {
            Log.e(TAG, e.getMessage());
        }

        return _rnd.nextInt();
    }

    @Override
    protected void onPostExecute(Integer result) {
        TestActivity test = (TestActivity) _context;
        test.Number = result;       
        super.onPostExecute(result);
    }
}
票数 2
EN

Stack Overflow用户

发布于 2012-03-16 20:33:36

只是一个警告:在尝试在AsyncTask中保存对活动实例的引用时要非常小心--我发现这是很困难的方法:)。如果用户碰巧在后台任务仍在运行时旋转设备,则您的活动将被销毁并重新创建,从而使对活动的引用无效。

票数 1
EN

Stack Overflow用户

发布于 2012-03-16 18:40:35

创建一个侦听器。

创建一个新的类文件。把它叫做MyAsyncListener,让它看起来像这样:

代码语言:javascript
运行
复制
 public interface MyAsyncListener() {
      onSuccessfulExecute(int numberOfSongList);
 }

让您的活动实现MyAsyncListener,

代码语言:javascript
运行
复制
 public class myActivity extends Activity implements MyAsyncListener {

将侦听器添加到AsyncTask的构造函数中,并将其设置为异步类中的全局变量。然后在onPostExecute中调用侦听器的方法并传递数据。

代码语言:javascript
运行
复制
 public class MyCustomAsync extends AsyncTask<Void,Void,Void> {

      MyAsyncListener mal;

      public MyCustomAsync(MyAsyncListener listener) {
           this.mal = listener;
      }

      @Override
      public void onPostExecute(asynctask.Payload payload) {
           \\update UI
           mal.onSuccessfulExecute(int numberOfSongList);
      }
 }

现在,无论何时完成AsyncTask,它都将调用活动类中的方法onSuccessfulExecute,如下所示:

代码语言:javascript
运行
复制
 @Override
 public void onSuccessfulExecute(int numberOfSongList) {
      \\do whatever
 }

祝好运。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9742446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档