ProgressDialog没有出现......我做错了什么?

时间:2012-03-12 08:28:44

标签: android multithreading progressdialog oncreate

我有一个ProgressDialog,如下所示:

package shc_BalloonSat.namespace;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import android.app.ProgressDialog;
import android.util.Log;

public class httpAPI
{
    Shc_BalloonSat_Activity shc;
    HttpClient client;
    ArrayList<NameValuePair> nameValuePairs;
    HttpResponse response;
    HttpEntity entity;
    InputStream is;
    String result = "";
    HttpPost httppost;
    Thread thread;
    private ProgressDialog progressDialog;

 public httpAPI(Shc_BalloonSat_Activity aContext)
 {
    System.out.println("in the constructor");
        shc = aContext;
 }

public String getData() throws Exception
{
    try
    {
    client = new DefaultHttpClient();
    nameValuePairs = new ArrayList<NameValuePair>();
    httppost = new HttpPost(shc.pref.getString(shc.lastpacketsPHP, shc.lastpacketsPHP.toString()));
    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    response = client.execute(httppost);
    entity = response.getEntity();
    is = entity.getContent();
    }

    catch (Exception e)
    {
    Log.e("log_tag", "Error in HTTP connection: " + e.toString());
    }

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

    return result;
}

public void runDialog()
{             
    while (thread.isAlive())
    {
    ProgressDialog.show(shc, "Please wait...", "Retrieving data...");
    try
        {
        thread = new Thread(getData());
        thread.start();
        }

    catch (Exception e)
        {
        // TODO Auto-generated catch block
        e.printStackTrace();
        }
    }

}

}

在加载时,应用程序从服务器提取信息并将其显示给用户。这有时需要很长时间,具体取决于手机的速度,这就是我添加线程的原因。我还添加了一个ProgressDialog,如代码所示。我正在从我的主类文件中调用所有这些,如下所示。但由于某种原因,它不想显示ProgressDialog。

package shc_BalloonSat.namespace;

import java.text.DecimalFormat;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.net.ConnectivityManager;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.SubMenu;
import android.widget.TextView;
import android.widget.Toast;

public class Shc_BalloonSat_Activity extends Activity
{
    int historyCountFromUser;
    httpAPI api;
    mapAPI map;
    DecimalFormat df = new DecimalFormat("##.#####");
    DecimalFormat decimalf = new DecimalFormat("##.######");
    AlertDialog alert;
    SharedPreferences pref;
    Editor prefEditor;
    String lastpacketsPHP;


// User to determine how many packet the user would like to see.
int userDefinedCount = 5;

/*
 *  Called when the activity is first created. 
*/

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    loadApp();
}

public boolean isNetworkConnected(Context context)
{
    ConnectivityManager connectionManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    if (connectionManager.getActiveNetworkInfo() != null && connectionManager.getActiveNetworkInfo().isAvailable() && connectionManager.getActiveNetworkInfo().isConnected())
    {
        return true;
    }

    else 
    {
        return false;
    }
}

public void showAlert()
{
    alert.setTitle("Sorry!");
    alert.setMessage("Please connect to the internet to access the full functionality of this app.");
    alert.setButton("OK", new DialogInterface.OnClickListener()
    {
        public void onClick(DialogInterface dialog, int which)
        {

        }
    });
    alert.show();
}

public void onResume()
{
    super.onResume();
    loadApp();
}

public void onRestart()
{
    super.onRestart();
    loadApp();
}

public void loadApp()
{
    setContentView(shc_BalloonSat.namespace.R.layout.main);
    alert = new AlertDialog.Builder(this).create();
    String returned = "";
    lastpacketsPHP = "";
    pref = getSharedPreferences("shared_prefs", 0);
    prefEditor = pref.edit();
    prefEditor.putString(lastpacketsPHP, "http://space.uah.edu/balloonsat_app/get_last_5_BS_packets.php");
    prefEditor.commit();

    // These next two lines are used to test the PHP files on the SHC server by determining if PHP is set up correctly.
    //prefEditor.putString(lastpacketsPHP, "http://www.wktechnologies.com/shc_android_app/get_last_5_BS_packets.php");
    //prefEditor.commit();   

    if (!isNetworkConnected(this))
    {
    showAlert();
    }

    else
    {
    api = new httpAPI(this);
        map = new mapAPI(this);

        try
        {
            returned = api.getData();
        }

    catch (Exception e)
    {
        Toast.makeText(this, "Error: Unable to receive data at this time.", Toast.LENGTH_SHORT).show();
    }

        TextView infoTV = (TextView)this.findViewById(shc_BalloonSat.namespace.R.id.info);
    infoTV.setText(returned);
    assignInfoToInfoTextView();
    assignInfoToHistoryTextView();
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(shc_BalloonSat.namespace.R.menu.mainmenu, menu);

    SubMenu submenu = menu.addSubMenu(0, Menu.FIRST, Menu.NONE, "Preferences");
    submenu.add(0, 5, Menu.NONE, "Get Last 5 Packets");
    submenu.add(0, 10, Menu.NONE, "Get Last 10 Packets");
    submenu.add(0, 20, Menu.NONE, "Get Last 20 Packets");
    inflater.inflate(shc_BalloonSat.namespace.R.menu.mainmenu, submenu);

    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item)
{
    // Handle item selection
    switch (item.getItemId())
    {
        case shc_BalloonSat.namespace.R.id.viewKML:
            viewKML();
            return true;
        case 5:
            viewLast5Packets();
            return true;
        case 10:
            viewLast10Packets();
            return true;
        case 20:
            viewLast20Packets();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

public void assignInfoToInfoTextView()
{
    TextView infoTV = (TextView)this.findViewById(shc_BalloonSat.namespace.R.id.info);
    infoTV.setText("");

    try
    {
            api.runDialog();
        String result = api.result.substring(1, api.result.length()-2);
        JSONObject json_data = new JSONObject(result);

    double altitudeData = json_data.getDouble("altitude");
    double altitudeInFeet = altitudeData * 3.281;
    String infoText = "Last Known Altitude: " + df.format(altitudeInFeet) + " ft\n";

    Double speedData = json_data.optDouble("speed");

    if (speedData.isNaN())
    {
        speedData = 0.00;
    }

    Double direction = json_data.optDouble("heading");
    String directionUnits = " degrees from N";
        String directionText = "";

        if (direction == 0)
        {
            directionText = ", N";
        }
        else if (direction > 0 && direction < 45)
        {
            directionText = ", N NE";
        }

        else if (direction == 45)
        {
            directionText = ", NE";
        }

        else if (direction > 45 && direction < 90)
        {
            directionText = ", E NE";
        }

        else if (direction == 90)
        {
            directionText = ", E";
        }

        else if (direction > 90 && direction < 135)
        {
            directionText = ", E SE";
        }

        else if (direction == 135)
        {
            directionText = ", SE";
        }

        else if (direction > 135 && direction < 180)
        {
            directionText = ", S SE";
        }

        else if (direction == 180)
        {
            directionText = ", S";
        }

        else if (direction > 180 && direction < 225)
        {
            directionText = ", S SW";
        }

        else if (direction == 225)
        {
            directionText = ", SW";
        }

        else if (direction > 225 && direction < 270)
        {
            directionText = ", W SW";
        }

        else if (direction == 270)
        {
            directionText = ", W";
        }

        else if (direction > 270 && direction < 315)
        {
            directionText = ", W NW";
        }

        else if (direction == 315)
        {
            directionText = ", NW";
        }

        else if (direction > 315 && direction < 360)
        {
            directionText = ", N NW";
        }

        else if (direction.isNaN())
        {
        directionText = " Invalid direction";
        }

        else
            {

            }

        infoText += "Last Known Velocity: " + df.format(speedData) + " m/s " + direction + directionUnits + directionText + "\n";

    double recentLatitudeData = json_data.getDouble("latitude");
    infoText += "Last Known Latitude: " + df.format(recentLatitudeData) + "\n";

    double recentLongitudeData = json_data.getDouble("longitude");
    infoText += "Last Known Longtitude: " + df.format(recentLongitudeData) + "\n";

    infoTV.setText(infoText);
    }

    catch (JSONException e)
    {
        // TODO Auto-generated catch block
        Log.e("<tag>", e.getMessage());
        Toast.makeText(this,"Error in (Last Known) method!",Toast.LENGTH_SHORT).show();
    }
    catch (Exception e)
    {
        Log.e("<tag>", e.getMessage());
        Toast.makeText(this,"Error in (Last Known) method!",Toast.LENGTH_SHORT).show();
    }
}

public void assignInfoToHistoryTextView()
{
    try
    {
        api.getData();
        JSONArray jArray = new JSONArray(api.result);
        TextView historyTV = (TextView)this.findViewById(shc_BalloonSat.namespace.R.id.history);
        historyTV.setText("");

        for (int count = 1; count < userDefinedCount; count++)
        {
                JSONObject json_data = jArray.getJSONObject(count);

                double altitudeData = json_data.getDouble("altitude");
                double altitudeInFeet = altitudeData * 3.281;
                String historyText = "Altitude: " + decimalf.format(altitudeInFeet) + " ft\n";

                Double speedData = json_data.optDouble("speed");

                if (speedData.isNaN())
                {
                    speedData = 0.00;
                }

                    Double direction = json_data.optDouble("heading");
                    String directionUnits = " degrees from N";
            String directionText = "";

            if (direction == 0)
            {
                directionText = ", N";
            }
            else if (direction > 0 && direction < 45)
            {
                directionText = ", N NE";
            }

            else if (direction == 45)
            {
                directionText = ", NE";
            }

            else if (direction > 45 && direction < 90)
            {
                directionText = ", E NE";
            }

            else if (direction == 90)
            {
                directionText = ", E";
            }

            else if (direction > 90 && direction < 135)
            {
                directionText = ", E SE";
            }

            else if (direction == 135)
            {
                directionText = ", SE";
            }

            else if (direction > 135 && direction < 180)
            {
                directionText = ", S SE";
            }

            else if (direction == 180)
            {
                directionText = ", S";
            }

            else if (direction > 180 && direction < 225)
            {
                directionText = ", S SW";
            }

            else if (direction == 225)
            {
                directionText = ", SW";
            }

            else if (direction > 225 && direction < 270)
            {
                directionText = ", W SW";
            }

            else if (direction == 270)
            {
                directionText = ", W";
            }

            else if (direction > 270 && direction < 315)
            {
                directionText = ", W NW";
            }

            else if (direction == 315)
            {
                directionText = ", NW";
            }

            else if (direction > 315 && direction < 360)
            {
                directionText = ", N NW";
            }

            else if (direction.isNaN())
            {
                directionText = " Invalid direction";
            }

            else
            {

            }

            if (direction.isNaN())
            {
                historyText += "Velocity: " + df.format(speedData) + " m/s " + directionText + "\n";
            }

            else
            {
                historyText += "Velocity: " + df.format(speedData) + " m/s,\n" + direction + directionUnits + directionText + "\n";
            }

                double latitudeData = json_data.getDouble("latitude");
                historyText += "Latitude: " + df.format(latitudeData) + "\n";

                double longitudeData = json_data.getDouble("longitude");
                historyText += "Longtitude: " + df.format(longitudeData) + "\n\n";

                historyTV.append(historyText);
        }
    }

    catch (JSONException e)
    {
        // TODO Auto-generated catch block
        Log.e("log_tag", "Error parsing data: " + e.toString());
    }
    catch(Exception e)
    {
        Log.e("log_tag", "Error parsing data: " + e.toString());
    }

}

void viewLast5Packets()
{
    if (!isNetworkConnected(this))
    {
        showAlert();
    }

    else
    {
        userDefinedCount = 5;
        prefEditor.putString(lastpacketsPHP, "http://space.uah.edu/balloonsat_app/get_last_5_BS_packets.php");
        prefEditor.commit();
        assignInfoToInfoTextView();
        assignInfoToHistoryTextView();
    }
}

void viewLast10Packets()
{
    if (!isNetworkConnected(this))
    {
        showAlert();
    }

    else
    {
        userDefinedCount = 10;
        prefEditor.putString(lastpacketsPHP, "http://space.uah.edu/balloonsat_app/get_last_10_BS_packets.php");
        prefEditor.commit();
        assignInfoToInfoTextView();
        assignInfoToHistoryTextView();
    }
}

void viewLast20Packets()
{
    if (!isNetworkConnected(this))
    {
        showAlert();
    }

    else
    {
        userDefinedCount = 20;
        prefEditor.putString(lastpacketsPHP, "http://space.uah.edu/balloonsat_app/get_last_20_BS_packets.php");
        prefEditor.commit();
        assignInfoToInfoTextView();
        assignInfoToHistoryTextView();
    }
}

public void viewKML()
{
    if (!isNetworkConnected(this))
    {
        showAlert();
    }

    else
    {
        map.openKML();
    }
 }
}

关于我可能做错的任何想法?

2 个答案:

答案 0 :(得分:1)

public void runDialog() {           
    Thread thread = null;
    while (thread.isAlive()) // You access null value here
    ...
}

其次,您使用loadApp()onCreate(..)onResume()方法调用onRestart()方法,这种方法可能不稳定并且显然是多余的。你应该从其中一种方法中调用它。

答案 1 :(得分:0)

public void runDialog(){
   Thread = null;
}

请检查线路......