我有两个一级用于api通话。和其他用于获取api类的值。函数的返回值为null。我如何从返回值结果中获得价值。 这是功能类: -
Jsondeletenote js = new Jsondeletenote(context);
String retn = js.deletsubmitData();
Log.d("calllllllllll render", "helo"+retn);
// retn value coming null
这里是api class
public String deletsubmitData() {
try {
new Thread(new Runnable() {
@Override
public void run() {
try {
Looper.prepare();
Log.d("looper", "-->>>>");
try {
isAuthorized = isAuthenticated();
} catch (Exception e) {
Log.e("Exception ==> ", e.toString());
}
MHandler.post(new Runnable() {
@Override
public void run() {
try {
if(isAuthorized){
if(AuthenticationResultJSONObject!=null){
Day1 = AuthenticationResultJSONObject.getString("Day");
String Tomorrow = AuthenticationResultJSONObject.getString("Tomorrow");
String Week = AuthenticationResultJSONObject.getString("Week");
}
}
else
{
///Toast.makeText(context, "Loing unsuccessfull, please try again !", Toast.LENGTH_SHORT).show();
}
}
catch (Exception e)
{
e.printStackTrace();
Log.e("Exception 146==> ", e.toString());
}
finally
{
//dialog.cancel();
}
}
});
} catch (Exception e) {
Log.e("Exception 153==> ", e.toString());
}
}
}).start();
} catch (Exception e) {
Log.e("Exception 159==> ", e.toString());
}
return Day1;
}
public boolean isAuthenticated()
{
isAuthorized = false;
final String url="www.abcd.com";
try {
AuthenticationResultJSONObject = new JSONObject(doFetchDataFromWebService_Simple_OnlyJSONResponse(url));
Log.v("Online", "User json array === "+AuthenticationResultJSONObject);
else
{
MHandler.post(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
Toast.makeText(context, "Please check your internet connection and try again.", Toast.LENGTH_SHORT).show();
}
});
}*/
}
catch(Exception e){
e.getMessage();
}
finally{
if(AuthenticationResultJSONObject!=null){
isAuthorized = true;
}
else
{
isAuthorized=false;
}
}
return isAuthorized;
}
答案 0 :(得分:0)
你的代码到处都是。我建议你改写它..
总而言之,你在一个不同的线程中做一个异步工作,这意味着" deletsubmitData"的返回值。 将立即返回null,而线程可能(并且可能)仍在工作。您应该做的是更改方法以返回void并为方法参数添加回调。在线程的操作结束时调用回调。
修改强>
使用其中的方法创建一个接口。然后从该接口传递一个新的实例对象作为参数,调用该方法。
这样的事情:
创建界面:
public interface IExampleCallBack
{
void onFinish(String result);
}
创建实例并传递为参数:
IExampleCallBack callback = new IExampleCallBack(
{
@Override
public void onFinish(String result)
{
//do whatever you want with result.
}
};
js.deletsubmitData(callback);
调用result中的interface方法:
public void deletsubmitData(IExampleCallBack callback)
{
//your code inside the thread...
//finish thread operation like so
String resultExample = "finished";
if (callback != null)
{
callback.onFinish(resultExample);
}
}
请注意,如果回调参数为null,则由于空检查,您将永远不会从线程获得回调。但最好让你的应用程序崩溃。
祝你好运。