Java 由于AsyncTask是一个单独的类,如何将OnPostExecute()的结果获取到主活动?

Java 由于AsyncTask是一个单独的类,如何将OnPostExecute()的结果获取到主活动?,java,android,android-asynctask,Java,Android,Android Asynctask,我从这个链接中读取并应用了一些东西:但是我在delegate.processFinish(result)行上得到了一个错误NullPointerException onPostExecute;我的代码中有什么问题?代码如下: public class MainActivity extends Activity implements AsyncResponse{ ProductConnect asyncTask =new ProductConnect(); public void pro

我从这个链接中读取并应用了一些东西:但是我在delegate.processFinish(result)行上得到了一个错误NullPointerException onPostExecute;我的代码中有什么问题?代码如下:

public class MainActivity extends Activity implements AsyncResponse{
  ProductConnect asyncTask =new ProductConnect();

  public void processFinish(String output){
    //this you will received result fired from async class of onPostExecute(result) method. 
    Log.v(TAG, output); 
  }


 @Override
 protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   asyncTask.delegate = this;
   setContentView(R.layout.activity_main);

   Button b = (Button) findViewById(R.id.button1);
   final Intent i=new Intent(MainActivity.this, second.class);
   b.setOnClickListener(new OnClickListener() {

     @Override
     public void onClick(View arg0) {

     // TODO Auto-generated method stub
     new ProductConnect().execute(true);
     startActivity(i);
     //startActivity(new Intent(MainActivity.this, second.class));

    }
  });
}


    // START DATABASE CONNECTION        
    class ProductConnect extends AsyncTask<Boolean, String, String> {          
       public AsyncResponse delegate=null;         
       private Activity activity;          
       public void MyAsyncTask(Activity activity) {
            this.activity = activity;
        }


       @Override
       protected String doInBackground(Boolean... params) {
         String result = null;
         StringBuilder sb = new StringBuilder();
           try {
             // http post
         HttpClient httpclient = new DefaultHttpClient();
         HttpGet httppost = new HttpGet("http://192.168.2.245/getProducts.php");
         HttpResponse response = httpclient.execute(httppost);
         if (response.getStatusLine().getStatusCode() != 200) {
           Log.d("MyApp", "Server encountered an error");
         }

         BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF8"));
         sb = new StringBuilder();
         sb.append(reader.readLine() + "\n");
         String line = null;

         while ((line = reader.readLine()) != null) {
           sb.append(line + "\n");
         }

             result = sb.toString();
         Log.d("test", result);
        } catch (Exception e) {
          Log.e("log_tag", "Error converting result " + e.toString());
        }
          return result;
        }

        @Override
        protected void onPostExecute(String result) {
          try {
            JSONArray jArray = new JSONArray(result);
            JSONObject json_data;
            for (int i = 0; i < jArray.length(); i++) {
              json_data = jArray.getJSONObject(i);
                  t = json_data.getString("name");
                  delegate.processFinish(result);
             }

             } catch (JSONException e1) {
             e1.printStackTrace();
             } catch (ParseException e1) {
             e1.printStackTrace();
             }
               super.onPostExecute(result);
        }

         protected void onPreExecute() {
           super.onPreExecute();
           ProgressDialog pd = new ProgressDialog(MainActivity.this);
           pd.setTitle("Lütfen Bekleyiniz");
           pd.setMessage("Authenticating..");
           pd.show();
         }
    }
public类MainActivity扩展活动实现异步响应{
ProductConnect asyncTask=新ProductConnect();
公共void processFinish(字符串输出){
//您将收到从onPostExecute(result)方法的异步类激发的结果。
Log.v(标签、输出);
}
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
asyncTask.delegate=这个;
setContentView(R.layout.activity_main);
按钮b=(按钮)findViewById(R.id.button1);
最终意图i=新意图(MainActivity.this,second.class);
b、 setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图arg0){
//TODO自动生成的方法存根
new ProductConnect().execute(true);
星触觉(i);
//startActivity(新意图(MainActivity.this,second.class));
}
});
}
//启动数据库连接
类ProductConnect扩展异步任务{
公共异步响应委托=null;
私人活动;
公共void MyAsyncTask(活动){
这个。活动=活动;
}
@凌驾
受保护字符串doInBackground(布尔值…参数){
字符串结果=null;
StringBuilder sb=新的StringBuilder();
试一试{
//http post
HttpClient HttpClient=新的DefaultHttpClient();
HttpGet httppost=新的HttpGet(“http://192.168.2.245/getProducts.php");
HttpResponse response=httpclient.execute(httppost);
如果(response.getStatusLine().getStatusCode()!=200){
Log.d(“MyApp”,“服务器遇到错误”);
}
BufferedReader=新的BufferedReader(新的InputStreamReader(response.getEntity().getContent(),“UTF8”);
sb=新的StringBuilder();
sb.append(reader.readLine()+“\n”);
字符串行=null;
而((line=reader.readLine())!=null){
sb.追加(第+行“\n”);
}
结果=sb.toString();
Log.d(“测试”,结果);
}捕获(例外e){
Log.e(“Log_标记”,“错误转换结果”+e.toString());
}
返回结果;
}
@凌驾
受保护的void onPostExecute(字符串结果){
试一试{
JSONArray jArray=新JSONArray(结果);
JSONObject json_数据;
for(int i=0;i
您必须将上下文传递给该任务

然后,在postExecute上,将上下文强制转换到您的活动

例如:

((MyActivity)context).doSomethingWithResults(resultOfAsyncTask);
编辑:

您的活动:

public class MyActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        new MyAsyncTask(this).execute();
    }

    public void sayHello(String name){
        Log.d("log","hello "+name+"!!!");
    }
}   
您的任务:

class MyAsyncTask extends AsyncTask<String,String,String>{
    Context context;
    public AutoPassarImatges(Context cont) {
        super();
                    this.context = cont;
        // TODO Auto-generated constructor stub
    }

    @Override
    protected String doInBackground(String... params) {
        [.......]

        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        ((MyActivity)context).sayHello(result);
    }



}
类MyAsyncTask扩展了AsyncTask{ 语境; 公共自动通行证(上下文续){ 超级(); this.context=cont; //TODO自动生成的构造函数存根 } @凌驾 受保护的字符串doInBackground(字符串…参数){ [.......] 返回null; } @凌驾 受保护的void onPostExecute(字符串结果){ ((MyActivity)context.sayHello(result); } }
我认为最好的方法是使用接口。为此创建一个侦听器


[]的

将变量初始化为
null

public AsyncResponse delegate=null;

因此,当您尝试使用它时,它自然会给出
NPE
。您在
活动中给它一个值,以便您可以将该值传递给
异步任务的构造函数,并将其初始化到该对象。

您正在这一行中启动一个新的异步任务:

new ProductConnect().execute(true);
您应该执行asyncTask,并使用以下命令更改该行:

asyncTask.execute(true);
从asynctask()方法创建新对象时,可以访问该方法。 样本:


我通过以下链接创建了一个接口:但我做错了。OP使用
接口
活动
使用
回调
…而不是尝试调用
活动
方法。@codeMagic如标题所示:如何获得OnPostExecute()的结果因为AsyncTask是一个单独的类,所以我给了他一个他可能理解的解决方案。我理解,但我没有否决。我只是说已经设置了一个解决方案,OP只需初始化变量,即
null
。当我将对象设置为非null时,会发生相同的错误。我如何给它一个正确的答案值?很抱歉,我是这类主题的新手。“您可以在活动中给它一个值,以便将其传递给AsyncTask的构造函数,并将其初始化到该对象。”但我看到你得到了一个答案,它以某种方式解决了这个问题。我没有为委托对象提供值。当它也为null时,它会工作。尽管如此,谢谢你的建议。你确实给了它一个值,但你没有意识到这一点。重要的是要理解为什么事情会工作。非常感谢你!它最终会工作:)我很长时间看不到这一点:)
LoginSyncProvider syncProvider = (LoginSyncProvider) new LoginSyncProvider(){
                                @Override
                                protected void onPostExecute(Void aVoid) {
                                    super.onPostExecute(aVoid);
                                    //TODO write something here
                                    }
                                }
                            }.execute();