简体   繁体   中英

How to retrieve data from a database and display it in textview for android? Asynctask doesnt load my data?

How do you display value from a database and display it in textview in android. I have got a tutorial for json parser and it seems to be working fine. When the application is running, it does not load my activity to the textview and it also does not show my status. I have posted yesterday for fault exception and I was helped. The activity seems to be never load my data into textview. I am posting up my code.

Here is my json. That I want to parse. It seems that I am parsing it correctly. But not displaying correctly.

{"success":1,"message":"Retrieve Status Successful!","status":[{"lock_op":"0","door_op":"0","date_modified":"2015-05-08 09:56:35"}]} 

Here is the status activity

package com.locking;

import android.support.v7.app.ActionBarActivity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import org.json.simple.*;
import org.json.simple.parser.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.concurrent.ExecutionException;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.w3c.dom.Text;

import com.locking.libraries.LobbyFunctions;
import com.locking.libraries.UserFunctions;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.Switch;

public class StatActivity extends Activity {
    int userId;
    int temp;
    int lockset = 0;
    int templock;
    int doorset = 0;
    String lock_op;
    String door_op;
    String door;
    String lock;
    String date;

    JSONArray status_user = null;
    TextView lockstat;
    TextView DoorStat;
    TextView DateStat;
    String statdisplay = "Lock is open";
    String statdisplay2 = "Lock is closed";
    String doordisplay = "door is open";
    String doordisplay2 = "door is closed";

//ArrayList<HashMap<String, String>> statusList;

    private static final String TAG_SUCCESS = "success";
    private static final String TAG_MESSAGE = "message";
    private static final String TAG_STATUS = "status";
    private static final String TAG_LOCK = "lock_op";
    private static final String TAG_DOOR = "door_op";
    private static final String TAG_DATE = "date_modified";

    private ProgressDialog pDialog;


    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //statusList = new ArrayList<HashMap<String, String>>();


        lockstat = (TextView) findViewById(R.id.switchstat);
        DoorStat = (TextView) findViewById(R.id.textView1);
        DateStat = (TextView) findViewById(R.id.DateField);

        try {

            // get lobbies from JSON and parse them. Wait until async task is
            // complete before continuing
            new GetStats().execute().get();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    class GetStats extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();

            pDialog = new ProgressDialog(StatActivity.this);
            pDialog.setMessage("Fetching Status..");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }

        @Override
        protected Void doInBackground(Void... args) {

            try {
                LobbyFunctions lobbyFunction = new LobbyFunctions();
                JSONObject json3 = lobbyFunction.GetStatus();
                int success = json3.getInt(TAG_SUCCESS);
                String message = json3.getString(TAG_MESSAGE);
                String status = json3.getString(TAG_STATUS);
                JSONArray status_user = new JSONArray(status);
                JSONObject c = status_user.getJSONObject(0);

                lock =c.getString(TAG_LOCK);
                door =c.getString(TAG_DOOR);
                date =c.getString(TAG_DATE);

                if (lock.equals("0")) {
                    lock = statdisplay;
                }
                if (lock.equals("1")) {
                    lock = statdisplay2;
                }

                if (door.equals("0")) {
                    door = doordisplay;
                }
                if (door.equals("1")) {
                    door = doordisplay2;
                }
                /*
                HashMap<String, String> statlist = new HashMap<String, String>();
                statlist.put(TAG_LOCK, lock);
                statlist.put(TAG_DOOR, door);
                statlist.put(TAG_DATE, date);

                statusList.add(statlist);

                */

            } catch (JSONException e) {
                e.printStackTrace();
            }

            // TODO Auto-generated method stub
            return null;
        }
        protected void onPostExecute(Void result) {
            // dismiss the dialog once done
            pDialog.dismiss();
            runOnUiThread(new Runnable() {
                public void run() {
                    Log.d("am I getting anything", lock);
                    lockstat.setText(lock);
                    DoorStat.setText(door);
                    DateStat.setText(date);

                }
            });


        }


    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

Here is my main activity.

package com.locking;

import android.support.v7.app.ActionBarActivity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import org.json.simple.*;
import org.json.simple.parser.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.concurrent.ExecutionException;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.w3c.dom.Text;

import com.locking.libraries.LobbyFunctions;
import com.locking.libraries.UserFunctions;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.Switch;



   public class MainActivity extends Activity {
        int userId;
        int temp;
        int lockset = 0;
        int templock;
        int doorset = 0;
        String lock_op;
        String door_op;
        String str_lockSet;
        String str_lockOff;

        JSONArray status_user = null;
        TextView lockstat;
        TextView DoorStat;
        TextView DateStat;
        String statdisplay = "Lock is open";
        String statdisplay2 = "Lock is closed";
        String doordisplay = "door is open";
        String doordisplay2 = "door is closed";

        private static final String TAG_SUCCESS = "success";
        private static final String TAG_MESSAGE = "message";

        private ProgressDialog pDialog;

        LobbyFunctions lobbyFunction = new LobbyFunctions();
        UserFunctions userFunction = new UserFunctions();
        UserFunctions socketConnect = new UserFunctions();
        UserFunctions sktConnect = new UserFunctions();

        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            Intent extras = getIntent();
            lockset = extras.getIntExtra("lockset", 0);
            doorset = extras.getIntExtra("doorset", 0);
            // userId = extras.getIntExtra("userId", 0);
            // temp = extras.getIntExtra("temp", 0);

            Button check = (Button) findViewById(R.id.button1);

            Button lock_on = (Button) findViewById(R.id.lock_on);
            Button lock_off = (Button) findViewById(R.id.lock_off);
            // button click event
            lock_on.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View view) {
                    new PostStatusOn().execute();
                    Intent restart = new Intent(getApplicationContext(),
                            MainActivity.class);
                    startActivity(restart);
                    finish();
                }
            });
            lock_off.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View view) {
                    // creating new product in background thread
                    new PostStatusOff().execute();
                    Intent restart = new Intent(getApplicationContext(),
                            MainActivity.class);
                    startActivity(restart);
                    finish();
                }
            });
            check.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    // creating new product in background thread
                    Intent gotocheck = new Intent(getApplicationContext(),
                            StatActivity.class);
                    startActivity(gotocheck);
                    finish();
                }
            });

        }

        class PostStatusOn extends AsyncTask<String, String, String> {

            protected String doInBackground(String... args) {
                if (lockset == 1) {
                    str_lockSet = "1";
                } else {
                    str_lockSet = "1";
                }
                // String str_lockSet = Integer.toString(lockset);
                String str_doorSetS = Integer.toString(doorset);

                JSONObject json = userFunction
                        .sendStatus(str_lockSet, str_doorSetS);
                // JSONObject jsonMod = userFunction.sendStatusMod(str_lockSet,
                // str_doorSetS);
                socketConnect.sendStatusMod(str_lockSet, str_doorSetS);
                Log.d("Create Response", json.toString());

                // check for success tag
                try {
                    int success = json.getInt(TAG_SUCCESS);

                    if (success == 1) {
                        // successfully registered the user
                        Log.d("User Registered!", json.toString());
                        Intent Logon = new Intent(getApplicationContext(),
                                MainActivity.class);
                        startActivity(Logon);

                        // closing this screen
                        finish();
                        return json.getString(TAG_MESSAGE);
                    } else {

                        // failed to register the user
                        Log.d("Register Failure!", json.getString(TAG_MESSAGE));
                        return json.getString(TAG_MESSAGE);
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }

                return null;

            }
        }

        class PostStatusOff extends AsyncTask<String, String, String> {
            protected String doInBackground(String... args) {
                if (lockset == 1) {
                    str_lockOff = "0";
                } else {
                    str_lockOff = "0";
                }

                // String str_lockOff = Integer.toString(lockOff);
                String str_doorSetS = Integer.toString(doorset);

                JSONObject json2 = userFunction.sendStatus(str_lockOff,
                        str_doorSetS);
                sktConnect.sendStatusMod(str_lockOff, str_doorSetS);

                Log.d("Create Response", json2.toString());

                // check for success tag
                try {
                    int success = json2.getInt(TAG_SUCCESS);

                    if (success == 1) {
                        // successfully registered the user
                        Log.d("Status Posted!", json2.toString());
                        Intent Logon = new Intent(getApplicationContext(),
                                MainActivity.class);
                        startActivity(Logon);

                        // closing this screen
                        finish();
                        return json2.getString(TAG_MESSAGE);
                    } else {

                        // failed to register the user
                        Log.d("Register Failure!", json2.getString(TAG_MESSAGE));
                        return json2.getString(TAG_MESSAGE);
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }

                return null;

            }
        }








        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }

        }

Here is my manifest file. I am sure that the manifest and my main activity is correct.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.locking"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="21" />

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".LogonActivity"
            android:label="@string/app_name" 
            android:launchMode="singleTop"
            android:windowSoftInputMode="adjustPan">
             <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".RegisterActivity"
            android:label="@string/app_name"
            android:launchMode="singleTop"
            android:windowSoftInputMode="adjustPan" />
        <activity
            android:name=".StatActivity"
            android:label="@string/app_name"
            android:launchMode="singleTop" />
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:launchMode="singleTop"
            android:windowSoftInputMode="adjustPan" />
    </application>
</manifest>

Please help me to solve this problem.

Here is my new error now.

05-08 16:07:19.001: E/AndroidRuntime(1866): FATAL EXCEPTION: main
05-08 16:07:19.001: E/AndroidRuntime(1866): Process: com.locking, PID: 1866
05-08 16:07:19.001: E/AndroidRuntime(1866): java.lang.NullPointerException
05-08 16:07:19.001: E/AndroidRuntime(1866):     at com.locking.StatActivity$GetStats$1.run(StatActivity.java:159)
05-08 16:07:19.001: E/AndroidRuntime(1866):     at android.app.Activity.runOnUiThread(Activity.java:4713)
05-08 16:07:19.001: E/AndroidRuntime(1866):     at com.locking.StatActivity$GetStats.onPostExecute(StatActivity.java:156)
05-08 16:07:19.001: E/AndroidRuntime(1866):     at com.locking.StatActivity$GetStats.onPostExecute(StatActivity.java:1)
05-08 16:07:19.001: E/AndroidRuntime(1866):     at android.os.AsyncTask.finish(AsyncTask.java:632)
05-08 16:07:19.001: E/AndroidRuntime(1866):     at android.os.AsyncTask.access$600(AsyncTask.java:177)
05-08 16:07:19.001: E/AndroidRuntime(1866):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
05-08 16:07:19.001: E/AndroidRuntime(1866):     at android.os.Handler.dispatchMessage(Handler.java:102)
05-08 16:07:19.001: E/AndroidRuntime(1866):     at android.os.Looper.loop(Looper.java:136)
05-08 16:07:19.001: E/AndroidRuntime(1866):     at android.app.ActivityThread.main(ActivityThread.java:5017)
05-08 16:07:19.001: E/AndroidRuntime(1866):     at java.lang.reflect.Method.invokeNative(Native Method)
05-08 16:07:19.001: E/AndroidRuntime(1866):     at java.lang.reflect.Method.invoke(Method.java:515)
05-08 16:07:19.001: E/AndroidRuntime(1866):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
05-08 16:07:19.001: E/AndroidRuntime(1866):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
05-08 16:07:19.001: E/AndroidRuntime(1866):     at dalvik.system.NativeStart.main(Native Method)

Updated Error with logcat saying my lock is closed. Meaning my lock_op is 1 from database. And I am able to retrieve the value. But displaying it has been an error.

05-08 16:21:06.040: I/Choreographer(1608): Skipped 177 frames!  The application may be doing too much work on its main thread.
05-08 16:21:15.650: D/dalvikvm(1608): GC_FOR_ALLOC freed 186K, 6% free 3881K/4124K, paused 3ms, total 4ms
05-08 16:21:15.700: W/EGL_emulation(1608): eglSurfaceAttrib not implemented
05-08 16:21:15.730: W/EGL_emulation(1608): eglSurfaceAttrib not implemented
05-08 16:21:15.870: D/am I getting anything(1608): Lock is closed
05-08 16:21:15.870: D/AndroidRuntime(1608): Shutting down VM
05-08 16:21:15.870: W/dalvikvm(1608): threadid=1: thread exiting with uncaught exception (group=0xb2d0eb20)
05-08 16:21:15.870: E/AndroidRuntime(1608): FATAL EXCEPTION: main
05-08 16:21:15.870: E/AndroidRuntime(1608): Process: com.locking, PID: 1608
05-08 16:21:15.870: E/AndroidRuntime(1608): java.lang.NullPointerException
05-08 16:21:15.870: E/AndroidRuntime(1608):     at com.locking.StatActivity$GetStats$1.run(StatActivity.java:160)
05-08 16:21:15.870: E/AndroidRuntime(1608):     at android.app.Activity.runOnUiThread(Activity.java:4713)
05-08 16:21:15.870: E/AndroidRuntime(1608):     at com.locking.StatActivity$GetStats.onPostExecute(StatActivity.java:141)
05-08 16:21:15.870: E/AndroidRuntime(1608):     at com.locking.StatActivity$GetStats.onPostExecute(StatActivity.java:1)
05-08 16:21:15.870: E/AndroidRuntime(1608):     at android.os.AsyncTask.finish(AsyncTask.java:632)
05-08 16:21:15.870: E/AndroidRuntime(1608):     at android.os.AsyncTask.access$600(AsyncTask.java:177)
05-08 16:21:15.870: E/AndroidRuntime(1608):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
05-08 16:21:15.870: E/AndroidRuntime(1608):     at android.os.Handler.dispatchMessage(Handler.java:102)
05-08 16:21:15.870: E/AndroidRuntime(1608):     at android.os.Looper.loop(Looper.java:136)
05-08 16:21:15.870: E/AndroidRuntime(1608):     at android.app.ActivityThread.main(ActivityThread.java:5017)
05-08 16:21:15.870: E/AndroidRuntime(1608):     at java.lang.reflect.Method.invokeNative(Native Method)
05-08 16:21:15.870: E/AndroidRuntime(1608):     at java.lang.reflect.Method.invoke(Method.java:515)
05-08 16:21:15.870: E/AndroidRuntime(1608):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
05-08 16:21:15.870: E/AndroidRuntime(1608):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)

There are a few things I see here. First, the onPostExecute in your GetStats AsyncTask and the doInBackground s on both of your AsyncTask s in your main activity are not overridden. All of those should have the @Override annotation. That way the compiler will then tell you if there's any mismatch between your method and AsyncTask 's.

Your ProgressDialog is not dismissing because the dialog you are dismissing is not the dialog you created. When you .show() the dialog you need to assign it back to pDialog or else you are not holding the right reference:

pDialog = pDialog.show();

Another is that you are not waiting anywhere for your tasks to complete or doing anything when they do. It looks like in your main activity when a user presses your lock_on and lock_off buttons you are executing your tasks and then immediately restarting your main activity. I would create a callback interface and have your activity restart in the callback from onPostExecute . I would also do this for your setText s to avoid using a runnable .

Here's some code on how I do that in my app:

This is in my fragment. You could do the same but substitute onCreate for onAttach :

static interface TaskCallbacks {
    void onPreExecute();
    void onProgressUpdate(int percent);
    void onCancelled();
    void onPostExecute();
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    mCallbacks = (TaskCallbacks) activity;
}

@Override
public void onPostExecute() {
    //Anything you need to do on UI thread
    lockstat.setText(lock);
    DoorStat.setText(door);
    DateStat.setText(date);
}

And then in your AsyncTask:

@Override
protected void onPostExecute(Void ignore) {
    if (mCallbacks != null) {
       mCallbacks.onPostExecute();
    //Whatever else you need to do
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM