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>