如何在外部转换内部AsyncTask?

时间:2014-10-06 13:08:34

标签: android android-asynctask inner-classes outer-join android-context

我创建了这个AsyncTask内部类,现在我想把它变成外层。这是代码:

    private class DownloadDataFromServer extends AsyncTask<String, Integer, String> {
        ProgressDialog dialog;
        boolean connErr = false;
        boolean soErr = false;

        @Override
        protected void onPreExecute() {
            dialog = new ProgressDialog(HomePage.this); !!!!PROBLEM!!!!
            dialog.setIndeterminate(false);
            dialog.setMax(100);
            dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            dialog.setCancelable(false);
            dialog.setTitle("Download");
            dialog.setMessage("Updating...");
            dialog.show();

            super.onPreExecute();
        }

        @Override
        protected String doInBackground(String... urls) {
            // do something
        }

        protected void onProgressUpdate(Integer... progress) {
            // Update the progress
            dialog.setProgress(progress[0]);
        }

        @Override
        protected void onPostExecute(String result) {
            if (connErr || soErr) {
                String msg = "Bad connection";
                AlertDialog.Builder builder;
                builder = new AlertDialog.Builder(HomePage.this); !!!!PROBLEM!!!!
                builder.setCancelable(false);
                builder.setTitle("Connection timeout");
                builder.setMessage(msg);

                builder.setPositiveButton("Retry", new DialogInterface.OnClickListener(){
                    @Override
                    public void onClick(DialogInterface dialog, int which)
                    {
                        dialog.dismiss();
                        new DownloadDataFromServer().execute(new String[] { "http://www.example.com" });
                    }
                });

                builder.setNegativeButton("Exit", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                        finish(); !!!!PROBLEM!!!!
                    }
                });         
                AlertDialog dialog = builder.create();
                dialog.show();
            } else {
                if (Integer.parseInt(result) <= 0) {
                    Toast.makeText(getBaseContext(), "Error!", Toast.LENGTH_SHORT).show(); !!!!PROBLEM!!!!
                } else {
                    Toast.makeText(getBaseContext(), "OK!", Toast.LENGTH_SHORT).show(); !!!!PROBLEM!!!!
                }
            }
            dialog.dismiss();
        }
    }

请注意&#34; !!!!问题!!!!&#34;上面代码中的字符串:我得到的所有错误。我试图应用一些解决方法,但最后我无法使其工作。另外我还必须使用

private Database db = new Database(this);

但我不知道应该用什么代替&#34;这个&#34;。请帮我以正确的方式转换这个内部类。

2 个答案:

答案 0 :(得分:5)

您应该将一个参数constructor设为DownloadDataFromServer类,并将上下文作为参数传递,如

Context mCon;

public DownloadDataFromServer(Context con){
 this.mCon=con;
}

并将此mCon上下文用于您DownloadDataFromServer中的任何位置

     builder = new AlertDialog.Builder(mCon);

最后从任何DownloadDataFromServer中调用Activity

new DownloadDataFromServer(your_Activity.this).execute(......);

答案 1 :(得分:2)

让你DownloadDataFromServer让构造函数接受HomeScreen,将主屏幕保存在构造函数的字段中,然后在任何地方使用该字段而不是HomeScreen.this

由于这个原因,您可能必须公开HomeScreen个私人字段(或提供访问者)。

你不想做那么多,有什么好处?

相关问题