-1

私のアプリケーション全体は、php 接続と mysql データ処理に基づいています。データのロードには少し時間がかかるため、現在、ユーザーは何が起こっているのかを見ることができず、データがロードされるのを待たずに、何も起こっていないと思ってボタンをクリックしてしまいます。

その解決策として、プログレスバーで「データロードまでお待ちください」を追加したいと思います。

どうすれば次のコードにそれを行うことができますか。

非同期タスクとチュートリアルを試してみましたが、コツがつかめませんでした。

ありがとうございました、

  public class Activity_YourFriendsWith_Class extends Activity {

public String PREFS_NAME = "MyPrefsFile";
public String PREFS_USERID = "prefsUserId";

private static final String TAG_Name = "fname";
private static final String TAG_LName = "lname";

String result = "";

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_yourfriendswith);

    SharedPreferences pref = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);

    String userId = pref.getString(PREFS_USERID, "");

    Button back = (Button) findViewById(R.id.addback);
    back.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Intent intent = new Intent();
            intent.setClass(getApplication(), Activity_MyProfile_Class.class);
            startActivity(intent);
            finish();
        }
    });

    Button addfrnds = (Button) findViewById(R.id.addfrnds);
    addfrnds.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            Intent inti = new Intent();
            inti.setClass(Activity_YourFriendsWith_Class.this,
                    Activity_AddFreinds_Class.class);
            startActivity(inti);
        }
    });



    InputStream is = null;

    ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
    nameValuePairs.add(new BasicNameValuePair("user_id", userId));
    try {
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost(
                "http://hopscriber.com/friendshopscriber.php");
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
        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());
    }
    // convert response to string
    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());
    }

    ProgressTask task = new ProgressTask();
    task.execute();

}
private class ProgressTask extends AsyncTask<String, Void, Boolean> {

           private ProgressDialog pd;
        private Activity activity;

        public void LoadDataTask(Activity activity){

            this.activity = activity;
        }


    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
        pd = ProgressDialog.show(activity,
                    "Please wait", "Loading datas", true);
    }

    @Override
    protected Boolean doInBackground(String... arg0) {
        // TODO Auto-generated method stub
        // parse json data
        try {

            ArrayList<HashMap<String, String>> placelist = new ArrayList<HashMap<String, String>>();
            JSONArray jArray = new JSONArray(result);
            if (jArray != null) {
                for (int i = 0; i < jArray.length(); i++) {
                    JSONObject json_data = jArray.getJSONObject(i);
                    HashMap<String, String> map = new HashMap<String, String>();

                    map.put(TAG_Name, json_data.getString("fname"));
                    map.put(TAG_LName, json_data.getString("lname"));

                    placelist.add(map);
                }
            }
            ListView list = (ListView) findViewById(R.id.frndslist);

            ListAdapter adapter = new SimpleAdapter(activity, placelist,
                    R.layout.listrow_yourfriendswith, new String[] { TAG_Name,
                            TAG_LName }, new int[] {
                            R.id.fname, R.id.lname });
            list.setAdapter(adapter);

        } catch (JSONException e1) {
            ListView list = (ListView) findViewById(R.id.frndslist);
            list.setEmptyView(findViewById(R.id.fempty));
        }
        return null;
    }

    }



}

ログキャット

08-16 16:26:52.748: E/AndroidRuntime(905): java.lang.RuntimeException: Unable to start activity ComponentInfo{hopscriber.com/hopscriber.com.Activity_YourFriendsWith_Class}: java.lang.NullPointerException
08-16 16:26:52.748: E/AndroidRuntime(905):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
08-16 16:26:52.748: E/AndroidRuntime(905):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
08-16 16:26:52.748: E/AndroidRuntime(905):  at android.app.ActivityThread.access$1500(ActivityThread.java:117)
08-16 16:26:52.748: E/AndroidRuntime(905):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
08-16 16:26:52.748: E/AndroidRuntime(905):  at android.os.Handler.dispatchMessage(Handler.java:99)
08-16 16:26:52.748: E/AndroidRuntime(905):  at android.os.Looper.loop(Looper.java:130)
08-16 16:26:52.748: E/AndroidRuntime(905):  at android.app.ActivityThread.main(ActivityThread.java:3683)
08-16 16:26:52.748: E/AndroidRuntime(905):  at java.lang.reflect.Method.invokeNative(Native Method)
08-16 16:26:52.748: E/AndroidRuntime(905):  at java.lang.reflect.Method.invoke(Method.java:507)
08-16 16:26:52.748: E/AndroidRuntime(905):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
08-16 16:26:52.748: E/AndroidRuntime(905):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
08-16 16:26:52.748: E/AndroidRuntime(905):  at dalvik.system.NativeStart.main(Native Method)
08-16 16:26:52.748: E/AndroidRuntime(905): Caused by: java.lang.NullPointerException
08-16 16:26:52.748: E/AndroidRuntime(905):  at android.app.Dialog.<init>(Dialog.java:141)
08-16 16:26:52.748: E/AndroidRuntime(905):  at android.app.AlertDialog.<init>(AlertDialog.java:63)
08-16 16:26:52.748: E/AndroidRuntime(905):  at android.app.ProgressDialog.<init>(ProgressDialog.java:80)
08-16 16:26:52.748: E/AndroidRuntime(905):  at android.app.ProgressDialog.<init>(ProgressDialog.java:76)
08-16 16:26:52.748: E/AndroidRuntime(905):  at android.app.ProgressDialog.show(ProgressDialog.java:101)
08-16 16:26:52.748: E/AndroidRuntime(905):  at android.app.ProgressDialog.show(ProgressDialog.java:90)
08-16 16:26:52.748: E/AndroidRuntime(905):  at hopscriber.com.Activity_YourFriendsWith_Class$ProgressTask.onPreExecute(Activity_YourFriendsWith_Class.java:132)
08-16 16:26:52.748: E/AndroidRuntime(905):  at android.os.AsyncTask.execute(AsyncTask.java:391)
08-16 16:26:52.748: E/AndroidRuntime(905):  at hopscriber.com.Activity_YourFriendsWith_Class.onCreate(Activity_YourFriendsWith_Class.java:81)
08-16 16:26:52.748: E/AndroidRuntime(905):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-16 16:26:52.748: E/AndroidRuntime(905):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
4

3 に答える 3

0

進行状況ダイアログで Asynctask を使用します。

于 2012-08-16T09:24:22.420 に答える
0

コードに関するいくつかの問題:

  1. あなたのコードは失敗すると思います-ダイアログの表示を要求していますが、表示するダイアログを返すOnCreateDialogがないため、次のようになります:

08-16 16:26:52.748: E/AndroidRuntime(905): 原因: java.lang.NullPointerException 08-16 16:26:52.748: E/AndroidRuntime(905): android.app.Dialog.(Dialog. java:141) )。

Activity クラスで onCreateDialog() をオーバーライドする必要があります

@Override
protected Dialog onCreateDialog(int id) {

ProgressDialog progress; 
progress = new ProgressDialog(this);
progress.setMessage("Loading data, please wait");
return progress;
}
  1. ダイアログの表示を開始するには、ProgressTask.preExecute() で次のコードを使用します。

    { int taskId=1; //単なる例

    showDialog(タスク ID); }

  2. ダイアログを閉じるには、ProgressTask.postExecute(); で DismissDialog(taskId) を使用します。

  3. メイン ストリームの HTTP 接続で例外が発生します。http 接続を実行するには、ProgressTask.doInBackground() を使用する必要があります。

  4. .doInBackground の UI 要素を変更しないでください。AsyncTask の .preExecute() および/または .postExecute() で、Activity の listAdapter およびその他の UI 要素を変更します。AsyncTask の使用法については、Google のチュートリアルで説明されています。

ここで提供した言及されたすべての問題をカバーする完全なコード例: Android, synctask not shown the list after progressDialog

于 2012-12-13T23:52:39.797 に答える
0

次のようなグローバル オブジェクトを取得します。

public ProgressDialog progress;
     protected void onCreate(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_yourfriendswith);
            progress = new ProgressDialog(this);
            ........................

それ以外の、

public ProgressDialog progress = new ProgressDialog(this);

それが動作します。

于 2012-08-16T09:55:25.290 に答える