Java 在网络调用期间显示ProgressDialog,直到它';完成了
在等待网络呼叫时,我一直在尝试实现一个超级简单的加载轮,我感到非常沮丧。我已经搜索和阅读了几十个这样的问题,我只是觉得我一定错过了什么,除非没有人真的做我想做的事。我尝试过执行Java 在网络调用期间显示ProgressDialog,直到它';完成了,java,android,Java,Android,在等待网络呼叫时,我一直在尝试实现一个超级简单的加载轮,我感到非常沮丧。我已经搜索和阅读了几十个这样的问题,我只是觉得我一定错过了什么,除非没有人真的做我想做的事。我尝试过执行AsyncTask路线,但这不是我想要的 我还要说,现在我的应用程序运行得很好,只是在网络上等待时,从屏幕到屏幕的转换似乎挂起了。我只想要一个加载轮,这样用户在1-2秒内就知道应用程序正在工作,不会冻结 以下是我当前的网络通话情况: private static String sendDataToServer(Strin
AsyncTask
路线,但这不是我想要的
我还要说,现在我的应用程序运行得很好,只是在网络上等待时,从屏幕到屏幕的转换似乎挂起了。我只想要一个加载轮,这样用户在1-2秒内就知道应用程序正在工作,不会冻结
以下是我当前的网络通话情况:
private static String sendDataToServer(String arg1, String arg2)
{
Thread dbThread = new Thread()
{
public void run()
{
// do the call that takes a long time
}
};
dbThread.start();
try {
// I do this so that my program doesn't continue until
// the network call is done and I have received the information
// I need to render my next screen
dbThread.join();
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
现在,为什么我不能像这样添加ProgressDialog
?如果我这样做,progressDialog将永远不会出现
private static String sendDataToServer(String arg1, String arg2)
{
final ProgressDialog progress = new ProgressDialog(BaseActivity.getInstance());
progress.setIndeterminate(true);
progress.setMessage("Loading...");
progress.show();
Thread dbThread = new Thread()
{
public void run()
{
// do the call that takes a long time
}
};
dbThread.start();
try {
dbThread.join();
progress.dismiss();
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
我想我被卡住了,因为网络调用需要位于与UI线程不同的线程上,但我不想在我的应用程序中继续,因为我需要该调用的结果才能继续。但是如果我执行thread.join()
操作,我会保留所有内容。我以为我需要AsyncTask
,但这很快就走下坡路了。如果你好奇的话,这是我的问题。
当调用发生时,我怎么能只显示一个加载对话框而不继续处理应用程序的其余部分
编辑
这是我的AsyncTask
尝试
private class PostToFile extends AsyncTask<PostToFile, Void, Void>{
private String functionName;
private ArrayList<NameValuePair> postKeyValuePairs;
private String result = "";
public PostToFile(String function, ArrayList<NameValuePair> keyValuePairs){
functionName= function;
postKeyValuePairs = keyValuePairs;
}
@Override
protected void onPreExecute() {
progressDialog = ProgressDialog.show(BaseActivity.getInstance(), "Loading", "Please wait...", true, false);
}
@Override
protected Void doInBackground(PostToFile... params) {
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair(FUNCTION_KEYWORD, functionName));
for (int i = 0; i < postKeyValuePairs.size(); i++) {
nameValuePairs.add(postKeyValuePairs.get(i));
}
try{
// ***do the POST magic.***
result = response.toString();
}
catch (Exception e){
// clean up my mess
}
return null;
}
private String getResult(){
return result; // can I use this somehow???
}
@Override
protected void onPostExecute(Void result) {
progressDialog.dismiss();
}
}
问题是,我有几个电话是背对背的,它们彼此依赖。因此第一个启动,第二个启动在第一个启动之后立即启动,但是在第一个启动之前,第一个启动是完成的。所以我有错误的行为。如何才能在第一次呼叫完成后才开始第二次呼叫?也许这会起作用,我还没有测试,但您可以尝试:
public class MyTask extends AsyncTask<String, Void, String> {
private int flag;
public MyTask(int flag) {
this.flag = flag;
}
@Override
protected String doInBackground(String... params) {
switch (flag) {
case 1:
return doNetworking1();
break;
case 2:
return doNetworking2();
break;
case 3:
return doNetworking3();
break;
default:
return doNetworking1();
}
}
@Override
protected void onPreExecute() {
//show progress dialog
}
@Override
protected void onPostExecute(String s) {
//hide progress dialog
switch (flag) {
case 1: //do something with result
new MyTask(2).execute();
break;
case 2: //do other stuff
new MyTask(3).execute();
break;
case 3: //do event more stuff
break;
default:
//do something
}
}
}
在网络连接的情况下,我将使用
IntentService
而不是AsyncTask
例如,为网络连接创建IntentService:
public class NetworkCallIntentService extends IntentService {
public static final String BROADCAST_ACTION = "com.yourpackage:NETWORK_CALL_BROADCAST";
public static final String RESULT = "com.yourpackage:NETWORK_CALL_RESULT";
public NetworkCallIntentService() {
super(NetworkCallIntentService.class.getSimpleName());
}
@Override
protected void onHandleIntent(Intent intent) {
// get data from intent if needed
// do the call that takes long time
// send broadcast when done
Intent intent = new Intent(BROADCAST_ACTION);
intent.putExtra(RESULT, "some_result");//and more results
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
}
接下来,从活动启动该服务,显示进度对话框,并将负责显示下一屏幕的代码移动到BroadcastReceiver#onReceive()
方法:
public class SomeActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//start service
Intent serviceIntent = new Intent(this, NetworkCallIntentService.class);
//put extras into intent if needed
//serviceIntent.putExtra("some_key", "some_string_value");
startService(serviceIntent);
//here just show progress bar/progress dialog
}
@Override
protected void onResume() {
super.onResume();
LocalBroadcastManager.getInstance(getApplicationContext()).registerReceiver(mNetworkCallReceiver,
new IntentFilter(NetworkCallIntentService.BROADCAST_ACTION));
}
@Override
protected void onPause() {
super.onPause();
LocalBroadcastManager.getInstance(getApplicationContext()).unregisterReceiver(mNetworkCallReceiver);
}
private BroadcastReceiver mNetworkCallReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//hide progress bar/progress dialog
//here get results from intent extras
String result = intent.getStringExtra(NetworkCallIntentService.RESULT);
//process results and continue program(go to next screen, show error message etc.)
}
}
}
在清单文件中声明服务:
<service
android:name="com.yourpackage.DownloadSvtValuesIntentService"
android:exported="false" >
</service>
这是我的问题的链接。基本上我不知道如何实现它,因为我希望数据在网络调用结束时以字符串的形式返回给我。我也不知道如何将所有内容都放在我的onPostExecute()
中,因为我觉得它基本上就是我应用程序的其余部分。AsyncTask-这些是在AsyncTask中使用的参数类型。doInBackground方法返回类Result
的对象,onPostExecute()接收类Result
的对象作为参数。但是,如果我执行get()
来获取结果,它将挂起,并破坏异步任务的目的。onPreExecute();2.doinbackground();3.onPostExecute()。当您使用get()时,任何东西都不会冻结,因为您使用的是doInBackground()方法。当方法完成时,它会将结果返回到onPostExecute()。但当我执行新建AsynTaskObject(params).execute()
时,它会启动,然后在执行完成之前立即执行下一行。在我知道execute()
完成之前,我不想继续前进。我知道“只要把它放在onPostExecute中”,但这对我来说没有意义。我正在尝试构建一个模块来处理我的网络呼叫,我不能在onPostExecute中转储所有内容(基本上是我的应用程序的其余部分)。
public class SomeActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//start service
Intent serviceIntent = new Intent(this, NetworkCallIntentService.class);
//put extras into intent if needed
//serviceIntent.putExtra("some_key", "some_string_value");
startService(serviceIntent);
//here just show progress bar/progress dialog
}
@Override
protected void onResume() {
super.onResume();
LocalBroadcastManager.getInstance(getApplicationContext()).registerReceiver(mNetworkCallReceiver,
new IntentFilter(NetworkCallIntentService.BROADCAST_ACTION));
}
@Override
protected void onPause() {
super.onPause();
LocalBroadcastManager.getInstance(getApplicationContext()).unregisterReceiver(mNetworkCallReceiver);
}
private BroadcastReceiver mNetworkCallReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//hide progress bar/progress dialog
//here get results from intent extras
String result = intent.getStringExtra(NetworkCallIntentService.RESULT);
//process results and continue program(go to next screen, show error message etc.)
}
}
}
<service
android:name="com.yourpackage.DownloadSvtValuesIntentService"
android:exported="false" >
</service>