【问题标题】:How can i to get the result of OnPostExecute() to main activity because AsyncTask is a separate class?由于 AsyncTask 是一个单独的类,我如何才能将 OnPostExecute() 的结果传递给主要活动?
【发布时间】:2013-10-02 14:12:45
【问题描述】:

我从这个链接阅读并应用了一些东西:How to get the result of OnPostExecute() to main activity because AsyncTask is a separate class? 但我在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();
         }
    }

【问题讨论】:

    标签: java android android-asynctask


    【解决方案1】:

    您将变量初始化为null

    public AsyncResponse delegate=null;
    

    当您尝试使用它时,它自然会给出NPE。你在你的Activity 中给它一个值,这样你就可以将它传递给你的AsyncTask 的构造函数并将它初始化为那个对象。

    【讨论】:

    • 我怎样才能给它一个价值?抱歉,我是这类科目的新手。
    • "你在你的 Activity 中给它一个值,这样你就可以将它传递给你的 AsyncTask 的构造函数并将它初始化为那个对象。"但我看到你得到了一个以某种方式解决它的答案。
    • 我没有给委托对象赋值。它也为空时有效。尽管如此,还是感谢您的建议。
    • 你确实给了它一个你没有意识到的价值。了解 为什么 事情起作用很重要。
    【解决方案2】:

    您正在这一行开始一个新的 AsyncTask:

    new ProductConnect().execute(true);
    

    您应该执行您的 asyncTask 更改该行:

    asyncTask.execute(true);
    

    【讨论】:

    • 非常感谢!它终于起作用了:)我很长一段时间都看不到这一点:)
    【解决方案3】:

    我认为最好的方法是使用接口。为此创建一个侦听器。

    []的

    【讨论】:

    【解决方案4】:

    您可以在从它创建新对象时访问 asynctask() 方法。 示例:

    LoginSyncProvider syncProvider = (LoginSyncProvider) new LoginSyncProvider(){
                                    @Override
                                    protected void onPostExecute(Void aVoid) {
                                        super.onPostExecute(aVoid);
                                        //TODO write something here
                                        }
                                    }
                                }.execute();
    

    【讨论】:

      【解决方案5】:

      您必须将上下文传递给该 AsyncTask。

      然后,在 postExecute 上,将上下文投射到您的 Activity。

      例子:

      ((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);
          }
      
      
      
      }
      

      【讨论】:

      • OP 正在使用interfacecallback 用于Activity...而不是尝试调用Activity 方法。
      • @codeMagic 如标题所述:我如何将 OnPostExecute() 的结果传递给主要活动,因为 AsyncTask 是一个单独的类?我给了他一个他可能会理解的解决方案。
      • 我理解并且我没有投反对票。我只是说已经设置了一个解决方案,OP只需要初始化变量null
      • 当我委托对象集不为空时,也会出现同样的错误。
      猜你喜欢
      • 2012-09-16
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 2016-02-20
      • 1970-01-01
      • 1970-01-01
      • 2012-08-03
      • 1970-01-01
      相关资源
      最近更新 更多