2012-08-16 34 views
-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; 
    } 

    } 



} 

logcat的

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) 

回答

0

使用的AsyncTask隨着進度對話框。

+0

http://www.vogella.com/articles/AndroidPerformance/article.html – 2012-08-16 09:25:49

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); 

它將工作。

+0

我想你的代碼,它的工作在我的電腦中...... :) – 2012-08-16 09:59:59

0

的幾個問題與您的代碼:

  1. 我猜你的代碼沒有 - 你請求對話框顯示,但 沒有OnCreateDialog返回對話框顯示,讓您獲得:

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

您需要在活動類重寫onCreateDialog()

@Override 
protected Dialog onCreateDialog(int id) { 

ProgressDialog progress; 
progress = new ProgressDialog(this); 
progress.setMessage("Loading data, please wait"); 
return progress; 
} 
  • 要開始展示對話框中,使用這個代碼在ProgressTask.preExecute():

    int taskId = 1; //只是示例

    showDialog(taskId); }

  • 關閉對話框 - 在ProgressTask.postExecute()中使用dismissDialog(taskId);

  • 主流中的HTTP連接會導致異常。你必須使用ProgressTask.doInBackground()來執行http連接。

  • 您不應該修改.doInBackground中的UI元素。修改AsyncTask的.preExecute()和/或.postExecute()中Activity和其他UI元素的listAdapter。它在Google教程中介紹了AsyncTask的用法。

  • 覆蓋上述所有問題的完整代碼的例子,我在這裏提供:Android, synctask not showing the list after progressDialog