2014-07-03 49 views
0

我有一个变量叫jsonString,它在我的按钮的OnClickListener事件中声明。在Runnable run()内部类中的变量访问()hock方法

但是,我有一个长时间运行的进程,它从返回jsonString的web服务获取信息。

我无法将jsonString声明为final,因为makeRequest函数将为其分配新值。

而我需要外部的jsonString,因为我需要将它传递给运行方法之外的另一个函数。

mBtnRegister.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       /* Register with web service */ 
       final String jsonString; 

       try { 
        new Thread(new Runnable() { 
         @Override 
         public void run() { 
          /* ACCESS TO VARIABLE WITHIN INNER CLASS */ 
          jsonString = snapClient.makeRequest(inputStreamKeystore, 
           keystorePassword, 
           cnn_url, 
           verifyEmail.createJSONRequest()); 
          Log.d(TAG, "Response Code returned: " + jsonString); 
         } 
        }).start(); 

       } catch (IOException e) { 
        Log.wtf(TAG, e.getMessage()); 
       } 

       verifyEmail.createJSONResponse(jsonString); 
       Toast.makeText(getActivity(), 
         "Webservice Response: " + verifyEmail.getErrCode() + " " + verifyEmail.getErrDesc(), 
         Toast.LENGTH_LONG).show(); 
      } 
     }); 

非常感谢您的任何建议,

+0

如何使jsonString成为一个全局变量。 –

回答

1

这是一个容器对象,像的AtomicReference是非常有用的。

考虑:

final AtomicReference<String> jsonString = new AtomicReference(); 

虽然可以做一个的AtomicReference工作考虑你将如何知道jsonString已经由生产线供应吗?鉴于它可能需要一点时间才能出现。你可以旋转检查null,或者使用信号量或等待/通知来阻塞新线程等。但是我建议你考虑使用future作为容器类。良好的期货让你注册回调,当价值被提供时被调用。

Akka拥有我所了解的期货的最佳实施,请参阅http://doc.akka.io/docs/akka/2.3.4/java/futures.html了解更多详情。

+0

谢谢,未来是我感兴趣的东西,并将结帐。这可能是我正在寻找的。 – ant2009