将异步任务结果传递给父级呼叫类

时间:2013-08-08 04:27:11

标签: android android-asynctask

我需要将异步任务结果传递给调用类。我创建了一个单独的ASync类,可以从其他类调用。我将“Post Execute”方法中的Async任务的响应传递给调用类方法,但是获得了零点异常。下面是我在

中的调用方法
public boolean getCategories() {

        serUri = "categories.json";
        WebServiceAsyncTask webServiceTask = new WebServiceAsyncTask();
        webServiceTask.execute(serUri,this);

        return true;
    }

从aysnc任务下面的结果执行的方法是

public void writeJSONArray(final JSONArray result)
            {


                try {

                for (int i=0; i<result.length();i++){
                    JSONObject c = result.getJSONObject(i);

                    String name = c.getString("catname");

                }
            } catch (JSONException e) {
                 e.printStackTrace();
             }
            }

WebServiceAsyncTask类:

public class WebServiceAsyncTask extends AsyncTask<Object,Void,JSONArray> {

    ROMSjson roms;
    private static JSONArray json = null;
    private Context context = null;

    protected JSONArray doInBackground(Object... params) {
        // TODO Auto-generated method stub
        String serviceUrl = (String) params[0];
         final HTTPHelper httph = new HTTPHelper(serviceUrl,context);
         if(serviceUrl.equalsIgnoreCase("categories.json")) {
             json = httph.fetch();

        }else if(serviceUrl.equalsIgnoreCase("categories/create"))
        {

        }

        return json;
    }


@Override
protected void onPostExecute(JSONArray result) { // invoked on the ui thread

   roms.writeJSONArray(result);  

   super.onPostExecute(result);

}

调用roms.writeJSONArray(result)时,我得到零点异常。在此命令之前正确接收结果。我查看了Log语句。另外,如果我在我的Async类中编写writeJSONArray方法而不是调用类,那么一切正常。

我不确定在传递结果或调用方法时是否遗漏了某些内容。请指教。感谢。

3 个答案:

答案 0 :(得分:0)

问题在于:

        else if(serviceUrl.equalsIgnoreCase("categories/create"))
        {
          // if it falls to this condition then your json object appears to be null
        }

希望这有帮助。

答案 1 :(得分:0)

null pointer exception

因为roms is null

您在ROMSjson roms;内声明WebServiceAsyncTask但未初始化它!

并在`onPostExecute(JSONArray result)

中使用它
roms.writeJSONArray(result);`  // here roms in null

所以 initialize roms才能使用它!

答案 2 :(得分:0)

接口是在类之间传递数据的最佳方式。

创建公共界面

public interface WebCallListener{
void onCallComplete(JSONArray result);
}

在班上做什么?

public class WebServiceAsyncTask extends AsyncTask<Object,Void,JSONArray> {

    ROMSjson roms;
    private static JSONArray json = null;
    private Context context = null;


    //update
    private WebCallListener local;


    public WebServiceAsyncTask(WebCallListener listener){
     local=listener;
    }
   /////

    protected JSONArray doInBackground(Object... params) {
        // TODO Auto-generated method stub
        String serviceUrl = (String) params[0];
         final HTTPHelper httph = new HTTPHelper(serviceUrl,context);
         if(serviceUrl.equalsIgnoreCase("categories.json")) {
             json = httph.fetch();

        }else if(serviceUrl.equalsIgnoreCase("categories/create"))
        {

        }

        return json;
    }


@Override
protected void onPostExecute(JSONArray result) { // invoked on the ui thread

//update

    super.onPostExecute(result);
   local.onCallComplete(result);  

}

来自您的通话课程。

public class CallingClass extends Activity{

 protecte void oncreate(Bundle b){

  new WebServiceAsyncTask(new WebCallListener() {

    @Override
    public void onCallComplete(JSONArray result) {
        //play with your response
    }
   });
 }
}