2013-04-15 67 views
1

我无法解释为什么onPostExecute没有在我的代码中被调用。我以前已经成功使用几乎这个确切的代码与不同的应用程序。它打印'onPreExecute'和从doInBackground获取JSON的成功结果,只是在return result;之前,但onPostExecute不打印任何东西 - 使用超级调用或不使用 - 而且不会将我的字符串返回到UI线程。有任何想法吗?onPostExecute没有被ASyncTask调用execute()

public class PrivateLoadFromServer extends AsyncTask<String, Integer, String> { 

    InputStream is = null; 
    String result = null; 
    String error_text=""; 
    JSONObject j = null; 
    String url; 
    SQLiteOpenHelper helper; 
    CustomActivity activity; 
    private Context context; 
    private ProgressDialog dialog; 
    private int count; 
    String employee; 
    String text; 

    public PrivateLoadFromServer(CustomActivity activity,String employee,String url){ 
     this.url=url; 
     this.employee=employee; 
     this.activity=activity; 
    } 

    @Override 
    protected void onPreExecute() { 
     system.out.println("onPreExecute"); 

    } 

    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
     System.out.println("onPostExecute"); 

     activity.setJSONResult(result); 
     /* 
     if(result!=null){ 
      System.out.println("Task reported successful"); 
      taskHandler.taskSuccessful(this.result); 
      activity.setJSONResult(this.result); 
     } else { 
      taskHandler.taskFailed(); 
     } 
     */ 
     //return; 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     System.out.println("Running aSyncTask"); 

      // Successful code to get JSON result string from server omitted. 

     System.out.println("Raw at doInBackground: " + result); 
    return result; 

编辑:如果已经张贴了这个原本,我把它作为CustomActivity内部类是这样的:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_login); 
    helper=new DBHelper(this); 
    loadBasicData(); 

} 

private void loadBasicData() { 

    // If you can encode all of these into one JSON Object, cool. 

    String url="*****" //Omitted URL. 
    String employee=null; 

    PrivateLoadFromServer syncTask = new PrivateLoadFromServer(this,employee,url); 

    syncTask.execute(); 

    try { 
     syncTask.get(15000, TimeUnit.MILLISECONDS); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (ExecutionException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (TimeoutException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    System.out.println("JSONResult at Activity:"+jsonResult); // jsonResult is null 

    } 
} 

    public void setJSONResult(String result){ 
    System.out.println("setJSONResult"+result); 
    this.jsonResult=result; // jsonResult is a field in the Activity. 
} 
+2

使用'AsyncTask'类来执行异步操作并仍然阻塞主线程调用'.get()'方法。另外,您遇到的问题总是会发生,或者只是在加载时旋转屏幕? – rciovati

+0

总是发生,与旋转无关。我必须阻止主线程,以便在调用将方法加载到本地数据库的方法之前获得JSON结果,或者使用空指针失败。 –

+1

网络请求完成后,你不能在'AsyncTask'中执行数据库加载吗?我不确定这是否是问题(可能是),但肯定您目前的方法会导致您遇到其他问题(例如ANR)。 – rciovati

回答

0

因为你调用get,JSON结果也从这个方法返回(见AsyncTask.java源代码。所以,你可以在输出直接调用你的方法。

try { 
    setJSONResult(syncTask.get(15000, TimeUnit.MILLISECONDS)); 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} catch (ExecutionException e) { 
    e.printStackTrace(); 
} catch (TimeoutException e) { 
    e.printStackTrace(); 
} 
+1

我仍然没有调用onPostExecute,但这确实让我把结果直接带入UI线程,所以作品,非常感谢:)我可能会最终将数据库操作引入ASync线程,因为主要的帖子评论者最后建议为了除去'.get()'。 –

0

确认您是否明确在代码中取消的AsyncTask的地方,才能够postExecute 。

+0

没有呼叫在任何地方取消。 –

+0

你为什么阻止你的主线程?这没有任何意义。 –

+0

请参阅我对主帖的评论。相同的是,例如在这里:https://groups.google.com/forum/?fromgroups=#!topic/android-developers/YcuihmCP2Fc –

0

onPostExecute()被调用如果它没有被调用,这意味着你的UI线程被阻塞做其他事情。

相关问题