How to return data from AsyncTask to the main stream

I want to return Jsonobject to the main thread. But when I tried to run the code, it returns the following error.

02-06 06:14:36.490: E/AndroidRuntime(769): FATAL EXCEPTION: main 02-06 06:14:36.490: E/AndroidRuntime(769): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.dataread/com.example.dataread.MainActivity}: java.lang.NullPointerException 02-06 06:14:36.490: E/AndroidRuntime(769): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 02-06 06:14:36.490: E/AndroidRuntime(769): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 02-06 06:14:36.490: E/AndroidRuntime(769): at android.app.ActivityThread.access$600(ActivityThread.java:141) 02-06 06:14:36.490: E/AndroidRuntime(769): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 02-06 06:14:36.490: E/AndroidRuntime(769): at android.os.Handler.dispatchMessage(Handler.java:99) 02-06 06:14:36.490: E/AndroidRuntime(769): at android.os.Looper.loop(Looper.java:137) 02-06 06:14:36.490: E/AndroidRuntime(769): at android.app.ActivityThread.main(ActivityThread.java:5039) 02-06 06:14:36.490: E/AndroidRuntime(769): at java.lang.reflect.Method.invokeNative(Native Method) 02-06 06:14:36.490: E/AndroidRuntime(769): at java.lang.reflect.Method.invoke(Method.java:511) 02-06 06:14:36.490: E/AndroidRuntime(769): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 02-06 06:14:36.490: E/AndroidRuntime(769): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 02-06 06:14:36.490: E/AndroidRuntime(769): at dalvik.system.NativeStart.main(Native Method) 02-06 06:14:36.490: E/AndroidRuntime(769): Caused by: java.lang.NullPointerException 02-06 06:14:36.490: E/AndroidRuntime(769): at com.example.dataread.MainActivity.onCreate(MainActivity.java:37) 02-06 06:14:36.490: E/AndroidRuntime(769): at android.app.Activity.performCreate(Activity.java:5104) 02-06 06:14:36.490: E/AndroidRuntime(769): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 02-06 06:14:36.490: E/AndroidRuntime(769): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 02-06 06:14:36.490: E/AndroidRuntime(769): ... 11 more 

This is my code:

 public interface Asynchtask { void processFinish(JSONObject result); } public class MainActivity extends ListActivity implements Asynchtask { JSONfunctions js= new JSONfunctions(); JSONObject retunfromAsyncTask; //public static JSONObject dataFromAsyncTask; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); js.delegate = this; new JSONfunctions().execute("http://192.168.6.43/employees.php"); setContentView(R.layout.listplaceholder); ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>(); try { JSONArray employees = retunfromAsyncTask.getJSONArray("Employees"); for(int i=0;i<employees.length();i++){ JSONArray e = employees.getJSONArray(i); HashMap<String, String> map = new HashMap<String, String>(); map.put("name", "emp name:" + e.getString(0)+" "+e.getString(1)+" "+e.getString(2)); map.put("email id", "email id: " + e.getString(3)); map.put("phone no", "phone no: " + e.getString(4)); mylist.add(map); } }catch(JSONException e) { Log.e("log_tag", "Error parsing data "+e.toString()); } ListAdapter adapter = new SimpleAdapter(this, mylist , R.layout.activity_main, new String[] { "name", "email id","phone no" }, new int[] { R.id.item_title, R.id.item_emailid ,R.id.item_phoneno}); setListAdapter(adapter); final ListView lv = getListView(); lv.setTextFilterEnabled(true); } @Override public void processFinish(JSONObject result) { // TODO Auto-generated method stub retunfromAsyncTask=result; } } public class JSONfunctions extends AsyncTask<String, Void, JSONObject> { public Asynchtask delegate=null; InputStream is; String result ; JSONObject jArray; @Override protected JSONObject doInBackground(String... params) { // TODO Auto-generated method stub //http post try{ HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(params[0]); HttpResponse response = httpclient.execute(httppost); HttpEntity entity = response.getEntity(); is = entity.getContent(); }catch(Exception e){ Log.e("log_tag", "Error in http connection "+e.toString()); } try{ BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8); StringBuilder sb = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } is.close(); result=sb.toString(); }catch(Exception e){ Log.e("log_tag", "Error converting result "+e.toString()); } try{ jArray = new JSONObject(result); // MainActivity.dataFromAsyncTask=jArray; }catch(JSONException e){ Log.e("log_tag", "Error parsing data "+e.toString()); } return jArray; //convert response to string } @Override protected void onPostExecute(JSONObject result) { delegate.processFinish(result); } } 

Manifestfile

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.dataread" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="4" android:targetSdkVersion="17" /> <uses-permission android:name="android.permission.INTERNET"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.dataread.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> 
+4
source share
3 answers

to get the result in the main topic, you will need to use the AsyncTask.get () method, which causes the user interface thread to wait until doInBackground is complete, but the get () method will freeze the main user interface thread until the doInBackground calculation is complete . run your AsyncTask using the get () method as:

 String str_result=new JSONfunctions().execute("http://192.168.6.43/employees.php").get(); 

move this line inside the thread to avoid hanging the user interface thread


The second and correct way to use AsyncTask move your code that you want to update, with the result of calculating doInBackground inside onPostExecute as:
 public class JSONfunctions extends AsyncTask<String, Void, JSONObject> { public Asynchtask delegate=null; InputStream is; String result ; JSONObject jArray; @Override protected JSONObject doInBackground(String... params) { // your code here.... return jArray; //convert response to string } @Override protected void onPostExecute(JSONObject result) { JSONArray employees = result.getJSONArray("Employees"); // your code here... ListAdapter adapter = new SimpleAdapter(MainActivity.this, mylist , R.layout.activity_main, new String[] { "name", "email id","phone no" }, new int[] { R.id.item_title, R.id.item_emailid ,R.id.item_phoneno}); MainActivity.this.setListAdapter(adapter); final ListView lv = MainActivity.this.getListView(); //.... } } 
+12
source
 new JSONfunctions().execute("http://192.168.6.43/employees.php"); 

But where do you delegate it?

 public Asynchtask delegate=null; 

So, I think you get NPE here:

 delegate.processFinish(result); 

PS this line js.delegate = this; not associated with a new instance of JSONfunctions. It sets the delegate for another instance (JSONfunctions js = new JSONfunctions ();)

0
source

using get (), we can get the result from Async

 response=new NetworkCallsHandler(this).execute(NetworkConstants.ASSETEVENTREPORT).get(); 
0
source

All Articles