java - 在安卓 : How can i send the result of from OnPostExecute() to other activity?

标签 java android android-asynctask

我得到了主要 Activity 的 OnPostExecute() 结果,但我想在第二个 Activity 中使用这个结果。我使用 Bundle 阅读并应用了一些东西,但它没有运行。我收到错误 NullPointerException 原因是没有收到第二个 Activity 中的值。这是我的 MainActivity(它有一个 AsyncResponse 接口(interface)):

public class MainActivity extends Activity implements AsyncResponse
 {
 public String t;
 public  Bundle bnd;
 public Intent intent;
 public String sending;
  private static final String TAG = "MyActivity";
  ProductConnect asyncTask =new ProductConnect();
  public void processFinish(String output){
        sending=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);

            bnd=new Bundle();

        intent=new Intent(MainActivity.this, second.class);

        b.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                asyncTask.execute(true);
             bnd.putString("veri", sending);
            intent.putExtras(bnd);
            startActivity(intent);
            }
        });
    }

//开始数据库连接

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

            } 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("Please wait");
                pd.setMessage("Authenticating..");
                pd.show();
            }
    }

这是我的第二个 Activity :

 public class second extends ActionBarActivity  {
        public CharSequence mTitle;
        private static final String TAG = "MyActivity";

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

        setContentView(R.layout.second);

        Bundle receive=getIntent().getExtras();
        String get=receive.getString("veri");
             Log.v(TAG, get);
      }

我该怎么办?

最佳答案

AsyncTask.execute() 是一个非阻塞调用。您不能将结果设置到 Bundle 并在 execute() 之后立即启动 Intent。这就是您在第二个 Activity 中获得 NPE 的原因,因为 sending 未初始化,因此它为空。

移动代码以在回调中使用所需数据启动新 Activity :

  public void processFinish(String output){

        bnd.putString("veri", output);
        intent.putExtras(bnd);
        startActivity(intent);

   }

并确保在数据处理完成后调用 delegate.processFinished(String)。所以把它移出 for 循环。顺便说一句,t 只会获取 JSONArray 中的最后一个“名称”字符串。如果你想得到它们,请将 t 设为一个字符串数组并填充它。

关于java - 在安卓 : How can i send the result of from OnPostExecute() to other activity?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19154153/

相关文章:

java - 我无法正确编译此代码。我究竟做错了什么?

java - 未找到 Gradle 项目依赖项

android - 为什么 Visual Studio (Xamarin) 中的 Android Asset 文件不允许有重音符号?

android - loader 和 AsyncTask 有什么区别?

android - 如何在android中停止异步任务线程?

java - 通过 void** 参数作为 char[] 与 JNA 获取函数结果

java - 在 Liferay 中保存自定义字段的数据

java - Android 中的线程处理长时间运行的进程

android - 如何将我自己的应用程序的 APK 文件保存在 sd 卡中并通过蓝牙共享? (仅通过使用代码和 Intent )

android - Facebook SDK 4.7.0 记录 AppEventsLogger 的 ClassNotFoundException