Questions tagged «android-asynctask»

用于android.os.AsyncTask上的问题


21
Android AsyncTask示例
我正在阅读有关的内容AsyncTask,并尝试了以下简单程序。但这似乎不起作用。我该如何运作? public class AsyncTaskActivity extends Activity { Button btn; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btn = (Button) findViewById(R.id.button1); btn.setOnClickListener((OnClickListener) this); } public void onClick(View view){ new LongOperation().execute(""); } private class LongOperation extends AsyncTask<String, Void, String> { @Override protected …

7
Android基础知识:在UI线程中运行代码
从在UI线程中运行代码的角度来看,两者之间是否有任何区别: MainActivity.this.runOnUiThread(new Runnable() { public void run() { Log.d("UI thread", "I am the UI thread"); } }); 要么 MainActivity.this.myView.post(new Runnable() { public void run() { Log.d("UI thread", "I am the UI thread"); } }); 和 private class BackgroundTask extends AsyncTask<String, Void, Bitmap> { protected void onPostExecute(Bitmap result) { Log.d("UI thread", …

21
如何在Android中显示Toast?
我有一个可以拉起的滑块,然后显示地图。我可以上下移动滑块以隐藏或显示地图。当地图在最前面时,我可以处理该地图上的触摸事件。每次碰到AsyncTask都会触发,它会下载一些数据并制作一个Toast显示数据的a。尽管我在触摸事件上启动任务,但没有显示吐司,直到关闭滑盖。当滑杆关闭且地图不再显示时,Toast出现。 有任何想法吗? 好好开始任务 编辑: public boolean onTouchEvent(MotionEvent event, MapView mapView){ if (event.getAction() == 1) { new TestTask(this).execute(); return true; }else{ return false; } } 并在onPostExecute烤面包 Toast.makeText(app.getBaseContext(),(String)data.result, Toast.LENGTH_SHORT).show(); 在new中TestTask(this),这是对MapOverlay(而非)的引用MapActivity,所以这就是问题所在。

13
处理程序与AsyncTask与线程[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 10个月前关闭。 我得到了稍微感到困惑之间的差异Handlers,AsyncTask并Threads在Android中。我已经在StackOverflow上阅读了很多博客和问题。 Handler是提供您与UI进行通信的后台线程。例如,更新进度条应通过进行Handler。使用处理程序具有的优势MessagingQueues,因此,如果您要计划消息或更新多个UI元素或具有重复任务。 AsyncTask相似,实际上,它们使用Handler,但没有在UI线程中运行,因此对于获取数据(例如获取Web服务)非常有用。稍后,您可以与UI进行交互。 Thread但是不能与UI交互,提供更多的“基本”线程,您会错过的所有抽象AsyncTask。 但是,我想在服务中运行套接字连接。应该在处理程序,线程还是什至是线程中运行它AsyncTask吗?完全不需要UI交互。我使用的性能是否有所不同? 同时,文档已得到重大改进。

17
由于AsyncTask是一个单独的类,如何使OnPostExecute()的结果进入主要活动?
我有这两节课。我的主要活动和扩展的一个AsyncTask,现在在我的主要活动,我需要从得到的结果OnPostExecute()中AsyncTask。如何将结果传递或获得主要活动? 这是示例代码。 我的主要活动。 public class MainActivity extends Activity{ AasyncTask asyncTask = new AasyncTask(); @Override public void onCreate(Bundle aBundle) { super.onCreate(aBundle); //Calling the AsyncTask class to start to execute. asyncTask.execute(a.targetServer); //Creating a TextView. TextView displayUI = asyncTask.dataDisplay; displayUI = new TextView(this); this.setContentView(tTextView); } } 这是AsyncTask类 public class AasyncTask extends AsyncTask<String, Void, …

3
警告:此AsyncTask类应该是静态的,否则可能会发生泄漏
我在代码中收到一条警告,指出: 此AsyncTask类应该是静态的,否则可能会发生泄漏(匿名android.os.AsyncTask) 完整的警告是: 此AsyncTask类应该是静态的,否则可能会发生泄漏(匿名android.os.AsyncTask)。静态字段将泄漏上下文。非静态内部类对其外部类具有隐式引用。如果该外部类例如是Fragment或Activity,则此引用意味着长时间运行的处理程序/加载器/任务将持有对该活动的引用,从而防止该活动获取垃圾。同样,对这些较长运行实例的活动和片段的直接字段引用也可能导致泄漏。ViewModel类永远不要指向视图或非应用程序上下文。 这是我的代码: new AsyncTask<Void,Void,Void>(){ @Override protected Void doInBackground(Void... params) { runOnUiThread(new Runnable() { @Override public void run() { mAdapter.notifyDataSetChanged(); } }); return null; } }.execute(); 我该如何纠正?

12
AsyncTask在概念上确实存在缺陷吗?还是我只是想念一些东西?
我已经研究了这个问题好几个月了,并提出了不同的解决方案,我不满意,因为它们都是大型黑客。我仍然不敢相信,一个存在设计缺陷的类将其纳入了框架,并且没有人在谈论它,所以我想我肯定一定会丢失一些东西。 问题出在哪里AsyncTask。根据文档吧 “允许执行后台操作并在UI线程上发布结果,而无需操纵线程和/或处理程序。” 然后,该示例继续说明如何showDialog()在中调用某些示例性方法onPostExecute()。但是,这似乎完全是我想做的,因为显示对话框始终需要引用有效对象Context,而AsyncTask 绝不能持有对上下文对象的强引用。 原因很明显:如果活动被破坏而触发了任务,该怎么办?这可能一直发生,例如因为您翻转了屏幕。如果该任务将保留对创建它的上下文的引用,则您不仅会保留一个无用的上下文对象(该窗口将被破坏,并且任何 UI交互都会失败,并带有异常!),您甚至可能会冒险创建一个内存泄漏。 除非我的逻辑在这里有缺陷,否则这将转化为:onPostExecute()完全没有用,因为如果您无权访问任何上下文,在UI线程上运行此方法有什么好处?您在这里不能做任何有意义的事情。 一种解决方法是不将上下文实例传递给AsyncTask,而是传递一个Handler实例。这行得通:由于Handler松散地绑定了上下文和任务,因此您可以在它们之间交换消息而不会冒泄漏的风险(对吗?)。但这意味着AsyncTask的前提是错误的,即您不必费心处理程序。由于您是在同一个线程上发送和接收消息,因此这似乎在滥用Handler(您在UI线程上创建消息,并在同样在UI线程上执行的onPostExecute()中通过它发送消息)。 最重要的是,即使有了这种解决方法,您仍然面临这样的问题:当上下文被销毁时,您没有记录它触发的任务。这意味着在重新创建上下文时(例如,在屏幕方向更改后),您必须重新启动所有任务。这是缓慢且浪费的。 我对此的解决方案(在Droid-Fu库中实现)是WeakReference在唯一的应用程序对象上维护s从组件名称到其当前实例的映射。每当AsyncTask启动时,它都会在该映射中记录调用上下文,并且在每个回调中,它将从该映射中获取当前上下文实例。这样可以确保您永远不会引用过时的上下文实例,并且始终可以访问回调中的有效上下文,从而可以在其中进行有意义的UI工作。它也不会泄漏,因为引用很弱,并且在不再存在给定组件的实例时将其清除。 尽管如此,这是一个复杂的解决方法,并且需要对某些Droid-Fu库类进行子类化,这使其成为一种非常侵入性的方法。 现在我只想知道:我只是大量丢失了东西还是AsyncTask确实完全有缺陷?您的经验如何处理?您是如何解决这些问题的? 感谢您的输入。

7
同时运行多个AsyncTasks-不可能吗?
我正在尝试同时运行两个AsyncTask。(平台是Android 1.5,HTC Hero。)但是,只有第一个被执行。这是描述我的问题的简单代码段: public class AndroidJunk extends Activity { class PrinterTask extends AsyncTask<String, Void, Void> { protected Void doInBackground(String ... x) { while (true) { System.out.println(x[0]); try { Thread.sleep(1000); } catch (InterruptedException ie) { ie.printStackTrace(); } } } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); new PrinterTask().execute("bar bar …

6
加载内容时在ImageView中使用“动画圆”
我当前在我的应用程序中使用的列表视图可能需要一秒钟才能显示出来。 我目前正在使用列表视图的@ id / android:empty属性创建“正在加载”文本。 <TextView android:id="@id/android:empty" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#FF0000" android:text="Loading..."/> 现在,我想用在加载对话框中使用的动画圆代替此文本替换它,我想你们都知道我的意思: 编辑:我不想对话框。我想在我的布局中显示出来。 非常感谢您的帮助!

8
安卓 片段getActivity()有时会返回null
在开发人员控制台错误报告中,有时我会看到NPE问题的报告。我不明白我的代码有什么问题。在模拟器和我的设备上,应用程序无需强制关闭即可正常运行,但是,某些用户在调用getActivity()方法时会在片段类中获得NullPointerException。 活动 pulic class MyActivity extends FragmentActivity{ private ViewPager pager; private TitlePageIndicator indicator; private TabsAdapter adapter; @Override public void onCreate(Bundle savedInstanceState) { pager = (ViewPager) findViewById(R.id.pager); indicator = (TitlePageIndicator) findViewById(R.id.indicator); adapter = new TabsAdapter(getSupportFragmentManager(), false); adapter.addFragment(new FirstFragment()); adapter.addFragment(new SecondFragment()); indicator.notifyDataSetChanged(); adapter.notifyDataSetChanged(); // push first task FirstTask firstTask = new FirstTask(MyActivity.this); …


12
Android上的AsyncTask和错误处理
我正在从使用转换我的代码 Handler为AsyncTask。后者非常擅长-异步更新和主UI线程中结果的处理。我不清楚的是,如果出现问题,如何处理异常AsyncTask#doInBackground。 我这样做的方法是拥有一个错误处理程序并将消息发送给它。它工作正常,但是是“正确”的方法还是有更好的选择? 我也知道,如果将错误处理程序定义为“活动”字段,则应在UI线程中执行。但是,有时(非常不可预测),我会收到异常消息,说明从触发的代码Handler#handleMessage在错误的线程上执行。我应该在其中初始化错误处理程序Activity#onCreate吗?放置runOnUiThread到Handler#handleMessage似乎是多余的,但执行非常可靠。


18
java.lang.IllegalStateException:onSaveInstanceState之后无法执行此操作
我正在为我的应用程序使用支持库。在我的FragmentActivity中,我使用AsyncTask从互联网下载数据。在onPreExecute()方法中,我添加一个片段,在onPostExecute()方法中,我再次将其删除。当方向在这两者之间改变时,出现上述异常。请看一下详细信息: private class onFriendAddedAsyncTask extends AsyncTask<String, Void, String> { DummyFragment dummyFragment; FragmentManager fm; FragmentTransaction ft; @Override protected void onPreExecute() { Log.v("MyFragmentActivity", "onFriendAddedAsyncTask/onPreExecute"); dummyFragment = DummyFragment.newInstance(); fm = getSupportFragmentManager(); ft = fm.beginTransaction(); ft.add(dummyFragment, "dummy_fragment"); ft.commit(); } @Override protected void onPostExecute(String result) { Log.v("MyFragmentActivity", "onFriendAddedAsyncTask/onPostExecute"); ft = fm.beginTransaction(); ft.remove(dummyFragment); ft.commit(); } @Override …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.