J'ai une asynctask qui accède aux données d'un serveur et remplit un flux principal-détail. Remplir la liste sur le côté gauche. Je peux voir le dialogue de progression fonctionner correctement. Lorsque je sélectionne cet élément, j'appelle une autre tâche asynchrone pour obtenir plus d'informations pour ce côté. Lorsque je sélectionne l'élément de la liste sur le côté gauche, la boîte de dialogue de progression n'apparaît pas. Il apparaît pendant une fraction de seconde, puis les données sont affichées.progression dialogue maître-détail ne pas afficher android
Comment puis-je créer une boîte de dialogue de progression qui s'affiche pendant la durée de la seconde tâche asynchrone qui obtient des données pour le fragment de la main droite?
gauche élément de la liste à la main:
public class ItemListFragment extends ListFragment
{
private ObjectOutputStream output;
private ObjectInputStream input;
private String message = "";
private Socket client;
private XMLCreator x = new XMLCreator();
private static final String STATE_ACTIVATED_POSITION = "activated_position";
private Callbacks mCallbacks = sDummyCallbacks;
private int mActivatedPosition = ListView.INVALID_POSITION;
public interface Callbacks
{
public void onItemSelected(int id, String value);
}
private static Callbacks sDummyCallbacks = new Callbacks()
{
@Override
public void onItemSelected(int id, String value)
{
}
};
public class ConnectToServer extends AsyncTask<Integer, String, ArrayList<String>>
{
ProgressDialog PD;
@Override
protected void onPreExecute()
{
//Works fine and shows up perfectly
super.onPreExecute();
PD = new ProgressDialog(ItemListFragment.this.getActivity());
PD.setTitle("Please Wait..");
PD.setMessage("Loading...");
PD.setCancelable(true);
PD.setIndeterminate(true);
PD.show();
}
@Override
protected ArrayList<String> doInBackground(Integer... params)
{
Socket client;
DataInputStream input;
DataOutputStream output;
String serverResult = "nothing";
XMLCreator x = new XMLCreator();
ArrayList<String> lists = new ArrayList<String>();;
try
{
Log.i("CLIENT", "Client started");
// Step 1: Create a Socket to make connection.
// client = new Socket(InetAddress.getLocalHost(), 500);
client = new Socket("10.0.0.5", 5001);
Log.i("CLIENT", "Connected to: "
+ client.getInetAddress().getHostName());
publishProgress("Connecting to server...");
// Step 2: Get the input and output streams.
input = new DataInputStream(client.getInputStream());
output = new DataOutputStream(client.getOutputStream());
output.flush();
Log.i("CLIENT", "Got I/O Streams");
publishProgress("Obtained Streams...");
// Step 3: Process connection.
// Step 4: Close connection.
Log.i("CLIENT", "Transmission complete. "
+ "Closing connection.");
output.writeUTF("TERMINATE");
client.close();
publishProgress("Closed connection...");
} catch (IOException e) {
e.printStackTrace();
String s = e.getMessage();
String b = s;
}
return lists;
}
@Override
protected void onPostExecute(ArrayList<String> lists)
{
super.onPostExecute(lists);
PD.dismiss();
List<DummyItem> ITEMS = new ArrayList<DummyItem>();
for (String s : lists)
{
int count = 1;
ITEMS.add(new DummyItem("",s));
}
setListAdapter(new ArrayAdapter<DummyContent.DummyItem>(getActivity(),
android.R.layout.simple_list_item_activated_1, android.R.id.text1, ITEMS));
}
@Override
protected void onProgressUpdate(String... values)
{
PD.setMessage(values[0]);
super.onProgressUpdate(values);
}
}
public ItemListFragment()
{
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
ConnectToServer task = new ConnectToServer();
task.execute();
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState)
{
super.onViewCreated(view, savedInstanceState);
// Restore the previously serialized activated item position.
if (savedInstanceState != null && savedInstanceState.containsKey(STATE_ACTIVATED_POSITION)) {
setActivatedPosition(savedInstanceState.getInt(STATE_ACTIVATED_POSITION));
}
}
@Override
public void onAttach(Activity activity)
{
super.onAttach(activity);
// Activities containing this fragment must implement its callbacks.
if (!(activity instanceof Callbacks))
{
throw new IllegalStateException("Activity must implement fragment's callbacks.");
}
mCallbacks = (Callbacks) activity;
}
@Override
public void onDetach() {
super.onDetach();
// Reset the active callbacks interface to the dummy implementation.
mCallbacks = sDummyCallbacks;
}
@Override
public void onListItemClick(ListView listView, View view, int position, long id)
{
super.onListItemClick(listView, view, position, id);
Object item = listView.getItemAtPosition(position);
String myitem = item.toString();
mCallbacks.onItemSelected(position, myitem);
}
@Override
public void onSaveInstanceState(Bundle outState)
{
super.onSaveInstanceState(outState);
if (mActivatedPosition != ListView.INVALID_POSITION)
{
outState.putInt(STATE_ACTIVATED_POSITION, mActivatedPosition);
}
}
public void setActivateOnItemClick(boolean activateOnItemClick)
{
getListView().setChoiceMode(activateOnItemClick ? ListView.CHOICE_MODE_SINGLE : ListView.CHOICE_MODE_NONE);
}
private void setActivatedPosition(int position)
{
if (position == ListView.INVALID_POSITION)
{
getListView().setItemChecked(mActivatedPosition, false);
} else
{
getListView().setItemChecked(position, true);
}
mActivatedPosition = position;
}
}
fragment droit détails à la main:
public class CountingFragment extends Fragment
{
int mNum;
String value;
List<Session> lists;
String[] simpleArray;
public class ConnectToServer extends AsyncTask<String, String, List<Session>>
{
ProgressDialog PD;
@Override
protected void onPreExecute()
{
//Doesn't show up at all ---> Want to show the dialog here
PD = new ProgressDialog(getActivity());
PD.setTitle("Please Wait..");
PD.setMessage("Loading...");
PD.setCancelable(true);
PD.setIndeterminate(true);
PD.show();
super.onPreExecute();
}
@Override
protected List<Session> doInBackground(String... params)
{
Socket client;
DataInputStream input;
DataOutputStream output;
String results = "";
XMLCreator x = new XMLCreator();
List<Session> items = new ArrayList<Session>();
try
{
Log.i("CLIENT", "Client started");
// Step 1: Create a Socket to make connection.
// client = new Socket(InetAddress.getLocalHost(), 500);
client = new Socket("10.0.0.5", 5001);
Log.i("CLIENT", "Connected to: "
+ client.getInetAddress().getHostName());
publishProgress("Connected...");
// Step 2: Get the input and output streams.
input = new DataInputStream(client.getInputStream());
output = new DataOutputStream(client.getOutputStream());
Log.i("CLIENT", "Got I/O Streams");
publishProgress("Obtained Streams...");
// Step 3: Process connection.
//Read in the value that the user selected from the bundle
String Day = params[0].toString();
// Step 4: Close connection.
Log.i("CLIENT", "Transmission complete. "
+ "Closing connection.");
output.writeUTF("TERMINATE");
client.close();
publishProgress("Closed connection...");
} catch (IOException e) {
e.printStackTrace();
}
return items;
}
@Override
protected void onPostExecute(List<Session> lists)
{
super.onPostExecute(lists);
PD.dismiss();
}
@Override
protected void onProgressUpdate(String... values)
{
PD.setMessage(values[0]);
super.onProgressUpdate(values);
}
}
/**
* Create a new instance of CountingFragment, providing "num" as an argument.
*/
static CountingFragment newInstance(int num, String value)
{
CountingFragment f = new CountingFragment();
// Supply num input as an argument.
Bundle args = new Bundle();
args.putInt("num", num);
args.putString("value", value);
f.setArguments(args);
return f;
}
/**
* When creating, retrieve this instance's number from its arguments.
*/
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
mNum = getArguments() != null ? getArguments().getInt("num") : 1;
value = getArguments() != null ? getArguments().getString("value") : "";
ConnectToServer task = new ConnectToServer();
try
{
lists = task.execute(value).get();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* The Fragment's UI is just a simple text view showing its instance number.
*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.main_world, container, false);
ListView lv = (ListView) view.findViewById(R.id.list_sessions);
final SessionAdapter adapter = new SessionAdapter(getActivity(), lists);
lv.setAdapter(adapter);
//ArrayAdapter<String> adapter = new ArrayAdapter<String>(
// inflater.getContext(), android.R.layout.simple_list_item_1,
// lists);
return view;
}
}
Y at-il une raison particulière pour expliquer pourquoi ma boîte de dialogue de progression n'apparaît pas sur certains des l'article de la liste ??? Où vais-je mal dans mon code ??
typique les raisons seraient que vous ne le fassiez pas sur l'UIThread et par conséquent cela n'arrive pas, ou le code est exécuté trop rapidement dans le doInBackground() et l'aide visuelle n'est pas montrée. –