dnk*_*tso 33 multithreading android android-context android-asynctask
我一直在使用Android中的AsyncTasks,我正在处理一个问题.
举一个简单的例子,一个带有一个AsyncTask的Activity.在背景上的任务没有做任何壮观的事情,只是睡了8秒钟.
在onPostExecute()方法的AsyncTask结束时,我只是将按钮可见性状态设置为View.VISIBLE,仅用于验证我的结果.
现在,这种方法很有效,直到用户决定在AsyncTask工作时(在8秒睡眠窗口内)更改手机方向.
我理解Android活动生命周期,我知道活动被破坏并重新创建.
这就是问题所在.AsyncTask指的是一个按钮,显然是对最初启动AsyncTask的上下文的引用.
我希望,这个旧的上下文(因为用户导致方向更改)要么变为null,要么AsyncTask要引用NPE以引用它试图使其可见的按钮.
相反,没有抛出NPE,AsyncTask认为按钮引用不为null,将其设置为可见.结果?屏幕上什么也没发生!
更新:我通过保持WeakReference活动并在配置更改发生时切换来解决这个问题.这很麻烦.
这是代码:
public class Main extends Activity {
private Button mButton = null;
private Button mTestButton = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mButton = (Button) findViewById(R.id.btnStart);
mButton.setOnClickListener(new OnClickListener () {
@Override
public void onClick(View v) {
new taskDoSomething().execute(0l);
}
});
mTestButton = (Button) findViewById(R.id.btnTest);
}
private class TaskDoSomething extends AsyncTask<Long, Integer, Integer>
{
@Override
protected Integer doInBackground(Long... params) {
Log.i("LOGGER", "Starting...");
try {
Thread.sleep(8000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return 0;
}
@Override
protected void onPostExecute(Integer result) {
Log.i("LOGGER", "...Done");
mTestButton.setVisibility(View.VISIBLE);
}
}
}
Run Code Online (Sandbox Code Playgroud)
尝试执行它并在AsyncTask工作时改变您的手机方向.
jas*_*ins 23
一旦活动被拆除并重新启动,AsyncTask就不能重复使用.内部处理程序对象变得陈旧,就像你说的那样.在Romain Guy的Shelves示例中,他简单地取消了当前正在运行的任何AsyncTask,然后在方向后更改时重新启动新的AsyncTask.
可以将Thread交给新的Activity,但它增加了很多管道.目前还没有达成共识,但你可以在这里阅读我的方法:http://foo.jasonhudgins.com/2010/03/simple-progressbar-tutorial.html
| 归档时间: |
|
| 查看次数: |
29848 次 |
| 最近记录: |