Reputation: 310
I wrote a function to read a text file at a URL. It worked when I compiled and ran it using java (not android) in command line. But when I port the function to an AsyncTask in Android studio. It simply crashes. Here is the code. Could you please tell me what is happening :(. Thanks a ton.
private class getjstr extends AsyncTask<String,Void,String> {
@Override
protected void onPreExecute(){
MainActivity.this.tv1.setText("STart"); //This is a TextView
}
@Override
protected String doInBackground(String... URLArr){
String result="";
String textURL=URLArr[0];
try{
URL URLObj = new URL(textURL);
BufferedReader bufReader = new BufferedReader(new InputStreamReader(URLObj.openStream()));
String tmpStr;
while((tmpStr=bufReader.readLine())!=null){
result=result + tmpStr;
}
bufReader.close();
}
catch (Exception e){
e.printStackTrace();
}
return result;
}
@Override
protected void onPostExecute(String result){
MainActivity.this.JString = result;
}
}
Logcat
05-23 17:12:20.591 32581-32581/com.momo.tobedelete E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.momo.tobedelete, PID: 32581
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.momo.tobedelete/com.momo.tobedelete.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3190)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3300)
at android.app.ActivityThread.access$1000(ActivityThread.java:211)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1705)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:6946)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference
at com.momo.tobedelete.MainActivity.onCreate(MainActivity.java:51)
at android.app.Activity.performCreate(Activity.java:6575)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1134)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3143)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3300)
at android.app.ActivityThread.access$1000(ActivityThread.java:211)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1705)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:6946)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
05-23 17:24:00.786 2033-2033/com.momo.tobedelete E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.momo.tobedelete, PID: 2033
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.momo.tobedelete/com.momo.tobedelete.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3190)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3300)
at android.app.ActivityThread.access$1000(ActivityThread.java:211)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1705)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:6946)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference
at com.momo.tobedelete.MainActivity.onCreate(MainActivity.java:51)
at android.app.Activity.performCreate(Activity.java:6575)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1134)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3143)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3300)
at android.app.ActivityThread.access$1000(ActivityThread.java:211)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1705)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:6946)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
onCreate
in MainActivity:
public class MainActivity extends AppCompatActivity {
List<Country> lc;
String JString;
TextView tv1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv1 = (TextView) findViewById(R.id.tv100);
String jurl = "https://dl.dropboxusercontent.com/u/98107627/feature_list_json";
new getjstr().execute(jurl);
this.tv1.setText(this.JString);
}
/*AsyncTask goes here*/
}
As far as I know, it seem the AsyncTask has failed to assign a new value to this.JString
Upvotes: 0
Views: 266
Reputation: 4743
As far as I understand your code you are trying to update a textview based on AsyncTask's result, so you're AsyncTask class definition should be something like:
new AsyncTask<String ,Void, String >()
which the result parameter is a String; then inside your onPostExecute method you will have something like :
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
}
and you can update your views!
Note that your should return the string that you want to put inside textview in your doInBackground() method!
Upvotes: 0
Reputation: 4891
this.tv1.setText(this.JString);
This line is causing the error. Remove it from onCreate().
set text in postExecute not in onCreate();
Upvotes: 2