phong
phong

Reputation: 310

Android: AsyncTask crash when reading text from a URL

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

Answers (2)

Reza
Reza

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

Sharad Chauhan
Sharad Chauhan

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

Related Questions