如何在 Android 的初始视图中获取 JSON 数据

How get JSON data while in splash view in Android

这里我尝试做一个应用。 首先它显示一个主页 page.It 将显示 2 秒。

这是代码...

public class MainActivity extends Activity {

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

    int secondsDelayed = 3;
    new Handler().postDelayed(new Runnable() {
            public void run() {
                    startActivity(new Intent(MainActivity.this,SocondActivity.class));
                    finish();
            }
    }, secondsDelayed * 1000);  
}
}

然后我的第二个 activity 想要显示初始视图,直到 json 从其余服务下载字符串。

这是我的代码....

public class SocondActivity extends Activity {

    private static final String TAG = "SocondActivity";

    //please assume my url is OK
    private static String url = "my url";

    private String jsonStr;

    private final int SPLASH_DISPLAY_LENGTH = 5000;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash_screen);




        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {


                new GetContacts().execute();
                Log.d(TAG,jsonStr);

                Intent mainIntent = new Intent(SocondActivity.this,
                        ThirdActivity.class);
                SocondActivity.this.startActivity(mainIntent);
                SocondActivity.this.finish();

            }
        }, SPLASH_DISPLAY_LENGTH);

    }

    private class GetContacts extends AsyncTask<Void, Void, Void> {

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

        protected Void doInBackground(Void... arg0) {

            //please assume that my Server Handler class is working fine
            ServiceHandler sh = new ServiceHandler();

            jsonStr = sh.makeServiceCall(url, ServiceHandler.GET);

            return null;
        }

    }

}

然后我得到这个错误......

java.lang.NullPointerException: println needs a message

因为 jsonStr 是空的.... 这是为什么??

这是我的R.layout.splash_screen

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <RelativeLayout
        android:id="@+id/loadingPanel"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center" >

        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:scaleType="center"
            android:src="@drawable/calendar_50" />

        <ProgressBar
            android:layout_below="@id/imageView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:indeterminate="true" />
    </RelativeLayout>



</LinearLayout>

谁能告诉我这个方法是否正确,我应该如何更改才能使其正确??

你有一个比赛案例。你需要做这样的事情。

而不是像下面那样在 onCreate 中使用处理程序(这只是为了创建一个复杂层,它不像你期望的那样运行)

new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            new GetContacts().execute();
            Log.d(TAG,jsonStr);

            Intent mainIntent = new Intent(SocondActivity.this,
                    ThirdActivity.class);
            SocondActivity.this.startActivity(mainIntent);
            SocondActivity.this.finish();
        }
    }, SPLASH_DISPLAY_LENGTH);

只需在您的 onCreate() 中调用它

new GetContacts().execute();

然后在您的 AsyncTask 中,像这样覆盖方法 onPostExecute

@Override
public void onPostExecute(Void voidParam){
    Log.d(TAG,jsonStr);

    Intent mainIntent = new Intent(SocondActivity.this,ThirdActivity.class);
    SocondActivity.this.startActivity(mainIntent);
    SocondActivity.this.finish();
}

这将告诉您的应用您想要执行 AsyncTask,并且当您完成时(并且仅当您完成时)您想要启动下一个 Activity.这消除了竞争情况以及对 handler/runnable.

的需要