我有一个远程调用,我想知道在哪里放置这个处理代码更好:
if ( result == null )
{
Toast.makeText(getApplicationContext(), "Some error message", Toast.LENGTH_LONG).show();
}
else
if ( result.equals( "all_problems_db_error" ))
{
Log.d( "AllBusinessesActivity" , "result: " + result )
}
else
{
// Unwrap the stuff from the JSON string
String problem_title = null;
String problem_id = null;
try
{
JSONArray obj = new JSONArray(result);
if ( obj != null )
{
problems.clear();
for ( int i = 0; i < obj.length(); i++ )
{
JSONObject o = obj.getJSONObject(i);
problem_title = o.getString("problem_title");
problem_id = o.getString("problem_id");
Problem p = new Problem ( );
p.setProblemId(problem_id);
p.setProblemName(problem_title);
problems.add( p );
}
adapter.notifyDataSetChanged();
}
}
catch ( Exception e )
{
// Do something :)
}
}
将它放在onPostExecute()或最后或doInBackground()中更好吗?
我现在在onPostExecute()中执行此操作,但每隔一段时间我就会遇到一些缓慢的问题,而且我一直在阅读在doInBackground中执行此操作可能会更好。
有人可以向我解释一下这个区别吗?如果我在doInBackground()中执行此操作,那么使用onPostExecute方法的目的是什么?
答案 0 :(得分:2)
当您需要在UI线程上执行操作时,onPostExecute
方法很有用。实际上,无法对doInBackground
方法中的UI进行任何操作。
因此,尝试在doInBackground
方法中进行所有数据的计算/下载等操作,并仅使用onPostExecute
方法对UI进行操作。
答案 1 :(得分:0)
Is it better to have it in the onPostExecute()
由于在您的情况下没有任何UI组件的操作,您可以使用doInBackground()
中的代码。但是,由于您在结果为toast
时显示null
,因此可以在doInBackground()
中检查结果,如果结果不为空,则可以对该{{1}进行剩余处理在相同的功能中,您可以传递到result
,您可以在其中显示onPostExecute()
。
toast
是。您可以在at the end or doInBackground()
的末尾使用此代码,因为此方法在非UI线程上运行,这肯定会减少您遇到的缓慢。
这两种方法doInBackground()
和doInBackground()
之间的区别仅仅在于前者在非UI线程上运行而后者在UI-Thread上运行。
onPostExecute()
通常And if I do this in the doInBackground() then what is the purpose of having the onPostExecute method
用于执行耗时的操作。这些操作可能包括调用Web服务或从服务器获取映像等活动。在这种情况下(比如从服务器获取图像),您希望图像显示在屏幕上(这是您的UI)。获取这些资源后,您将数据传递到doInBackground()
,您可以在其中更新UI,因为它在您的UI线程上运行。
希望这个解释清除你的怀疑。