0

ここでは、データがローカル データベースに同期されるときに、最初にアプリケーションがサーバーからデータを同期します。1 つのテーブルにクエリを実行してそのデータを取得し、そこから画像の uri を取得し、別のバックグラウンド タスクを使用してユーザーの画像を SD カードにダウンロードします。バックグラウンド スレッドはブール型であるため、機能を呼び出してそこから画像を取得することはできません。postexecute からメソッドを呼び出すと、NetworkOnMainthread 例外が発生します。以下の安全なスレッドを使用する必要がある状態でスタックしています。

protected void onPreExecute() {
    mDialog = ProgressDialog.show(viewContext, "", "Synchronizing Data",
            true);

};

/*
 * (non-Javadoc)
 * 
 * @see android.os.AsyncTask#doInBackground(Params[])
 */
@Override
protected Boolean doInBackground(Void... arg0) {
    if (type.contains("ferry")) {
        return SynchronizeRepositoryFerry(false);

    } else {
        return SynchronizeRepositories(false, initialSync);
    }
}

/*
 * (non-Javadoc)
 * 
 * @see android.os.AsyncTask#onPostExecute(java.lang.Object)
 */
@Override
protected void onPostExecute(Boolean result) {
    this.syncComplete = result;
    mDialog.dismiss();
    if (type.contains("Dash")) {
        new BackgroundTask().execute();
    }
    else{
        Intent intent = new Intent();
        intent.setClass(viewContext, classType);
        viewContext.startActivity(intent);

    }


}

class BackgroundTask extends AsyncTask<Void, Void, Void> {
    ProgressDialog mDialog;

    protected void onPreExecute() {
        mDialog = ProgressDialog.show(viewContext, "", "Loading Images",
                true);
    };

    @Override
    protected Void doInBackground(Void... params) {
        try {
            int id = 0;
            String url = "http://i.zdnet.com/blogs/3-29-androids.jpg";
            com.jumbybay.businessobjects.User user = new com.jumbybay.businessobjects.User();
            DatabaseHelper dbHelper = new DatabaseHelper(viewContext);
            IUserRepository repository = dbHelper.getUserRepository();
            List<com.jumbybay.businessobjects.User> imageList;
            try {
                imageList = repository.Retrieve();
                for (int i = 0; i < imageList.size(); i++) {
                    user = imageList.get(i);
                    // url = user.getPicture();
                    id = user.getId();
                    savesd(id, url);

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

        } catch (final Exception e) {

        }
        return null;
    }

    public void savesd(int id, String uri) throws IOException {
        URL url;
        if (uri == null) {
            url = new URL("http://i.zdnet.com/blogs/3-29-androids.jpg");
        } else {
            url = new URL(uri);
        }
        InputStream input = url.openStream();
        try {
            File storagePath = Environment.getExternalStorageDirectory();
            OutputStream output = new FileOutputStream(new File(
                    storagePath, +id + ".jpg"));

            try {
                byte[] buffer = new byte[20000];
                int bytesRead = 0;
                while ((bytesRead = input.read(buffer, 0, buffer.length)) >= 0) {
                    output.write(buffer, 0, bytesRead);
                }
            } finally {
                output.close();
            }
        } catch (Exception e) {

            e.printStackTrace();
        } finally {
            input.close();
        }

    }

    protected void onPostExecute(Void result) {
        mDialog.dismiss();
        Intent intent = new Intent();
        /*
         * intent.setClass(viewContext, classType);
         * viewContext.startActivity(intent);
         */

        intent.setClass(viewContext, classType);
        viewContext.startActivity(intent);

    };
}
4

2 に答える 2

1
@Override
    protected Boolean doInBackground(Void... arg0) {
        if (type.contains("ferry")) {
            return SynchronizeRepositoryFerry(false);

        } else {
            SynchronizeRepositories(false, initialSync);
            com.jumbybay.businessobjects.User user = new com.jumbybay.businessobjects.User();
            DatabaseHelper dbHelper = new DatabaseHelper(viewContext);
            IUserRepository repository = dbHelper.getUserRepository();
            List<com.jumbybay.businessobjects.User> imageList;
            try {
                int id;
                String url = "http://i.zdnet.com/blogs/3-29-androids.jpg";
                imageList = repository.Retrieve();
                for (int i = 0; i < imageList.size(); i++) {
                    user = imageList.get(i);
                    // url = user.getPicture();
                    id = user.getId();
                    savesd(id, url);
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block// url = user.getPicture();
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
        return SynchronizeRepositories(false, initialSync);
    }
于 2012-08-28T05:09:31.303 に答える
0

この問題には 2 つの解決策がありますが、最初の解決策は素晴らしい解決策です。

1) メイン UI スレッドにネットワーク呼び出しを記述しないでください。そのために非同期タスクを使用します。

2) setContentView(R.layout.activity_main); の後に MainActivity ファイルに以下のコードを記述します。しかし、これは適切な方法ではありません。

if (android.os.Build.VERSION.SDK_INT > 9) {
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);
}

以下の import ステートメントを Java ファイルに挿入します。

import android.os.StrictMode;

詳細については、以下のリンクを参照してください。

原因: android.os.NetworkOnMainThreadException

于 2012-08-28T05:49:07.790 に答える