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

Android AsyncTask:将值传递给活动(onCreate方法),android,android-asynctask,Android,Android Asynctask,更新1 活动: public Integer _number = 0; @Override public void onCreate(Bundle savedInstanceState) { if (_number >0) { Log.d("onSuccessfulExecute", ""+_number); } else { Log.d("onSuccessfulExe

更新1

活动:

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;
}
结束更新1

更新:AsynchTask有自己的外部类

如何从AsyncTask onPostExecute()传递值。。。活动

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

异步任务类:

@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;
            ..............
            ..............
    }
活动:

  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);

    } 
创建一个侦听器

创建一个新的类文件。将其称为MyAsyncListener,并使其看起来像这样:

 public interface MyAsyncListener() {
      onSuccessfulExecute(int numberOfSongList);
 }
使您的活动实现MyAsyncListener,即

 public class myActivity extends Activity implements MyAsyncListener {
将侦听器添加到AsyncTask的构造函数中,并将其设置为Async类中的全局变量。然后在onPostExecute中调用侦听器的方法并传递数据

 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);
      }
 }

祝你好运。

使用setter方法怎么样?e、 g

private int _number;
public int setNumber(int number) {
    _number = number;
}
更新:

请看这个代码。这将完成您试图完成的任务

活动类

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();
    }
}
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);
    }
}
异步任务类

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();
    }
}
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);
    }
}
公共类TestTask扩展了AsyncTask{
私有最终上下文_上下文;
私有最终字符串TAG=“TestTask”;
私人最终随机数据;
公共测试任务(上下文){
_上下文=上下文;
_rnd=新随机数();
}
@凌驾
受保护的void onPreExecute(){
//TODO:执行任务初始化。
super.onPreExecute();
}
@凌驾
受保护的整数doInBackground(Void…params){
//模拟长时间运行的过程。
试一试{
睡眠(3000);
}捕捉(中断异常e){
Log.e(标记,e.getMessage());
}
返回_rnd.nextInt();
}
@凌驾
受保护的void onPostExecute(整数结果){
测试活动性测试=(测试活动性)\u上下文;
测试编号=结果;
super.onPostExecute(结果);
}
}

请注意:在异步任务中尝试保留对活动实例的引用时要非常小心-我发现这很难:)。如果用户碰巧在后台任务仍在运行时旋转设备,则您的活动将被销毁并重新创建,从而使对该活动的引用无效。

如果您希望在该
Log.v()中看到
NumberOfSongsList
调用它可能不会发生,因为
异步任务未完成其作业。那
asynctask.PayLoad
响应到底是什么?它肯定不会在Log.d中更新("onCreate…。您正在显示的。asyncTask和线程的开销将确保这一点。您是否检查过该值稍后在程序中更新?是的,它不会在日志中更新。d我知道。这就是为什么我需要帮助…是的,它会在onPostExecute中更新该值,我可以看到它,但不会在活动中看到它。这也不会起作用因为AsyncTask没有像slukian指出的那样完成任务,这是有意义的,我在调试时注意到了这一点。谢谢,但我有一个问题,为什么我需要硬编码活动名称
TestActivity test=(TestActivity)_context;
我正在处理一个任何活动都应该可以调用的类,但如果我采用您的方法,我会看到活动是硬编码的……有什么想法吗?_context可以是任何活动,我只是使用TestActivity快速演示访问我的活动字段。不起作用……没有错误,但没有显示值。我将更新问题nas您可以看到,我一直在努力将AsyncTask放在自己的类中,而不是包含活动的子类中,但这似乎非常具有挑战性……我开始意识到,拥有自己的类与拥有子类之间没有任何区别。有什么想法吗?您能告诉我AsyncTask执行的是哪种类型的函数吗?(调用web服务等)?我建议按照下面的帖子所建议的做,在活动中添加一个setter方法,然后在调试器中设置一个断点,看看setter是否被调用。但请记住,在某个时候,当doInBackground()运行时,您将不得不处理正在销毁/重新创建的活动方法正在执行。我发现此视频内容非常丰富: